新規投稿
フォローする

レコード保存時にテーブルデータを別アプリにレコードとして登録が、たまに失敗する

お世話になります。

レコード保存時にテーブルデータにユニークIDを採番して、
別アプリにレコードとして保存するJavaScriptを実装しています。
ほとんどの場合、うまく動作するのですが
たまにユニークIDはふられているのに別プリに保存できていないときがあり
その原因がわからず困っています。
(再度やり直すとうまく動作する)
テーブルの行数が多いときに比較的よく起こっているようです。

このような経験のある方、原因にお心当たりのある方がおられましたら
ご教示お願いいたします。

0

4件のコメント

Avatar
江田篤史

b-dama様

お世話になっております.
トヨクモの江田と申します.

データ数が多いときに上手く処理されないということなので,ブラウザのメモリの問題などがもしかしたらあるのかもしれません.
https://qiita.com/t_konparu/items/01c9a6d9bfee119f578d

また,大量のAPIを叩いているのであれば,同時接続数制限にかかっているのかもしれません.
https://developer.cybozu.io/hc/ja/articles/360020272112

可能な範囲でコードをご提示いただければ,もう少しお力になれるかもしれません.

0
Avatar
b-dama

江田さま
お返事ありがとうございます。

ソースはこんな感じです。
よろしくお願いいたします。

テーブルデータが多いといっても50行もないくらいです・・・

function () {
"use strict";
kintone.events.on(['app.record.create.submit'], function (event) {
var record = event.record;
var tableRecords = record.order_list.value;
var addRecords = [];
var item_app = 10;
for (var h = 0; h < tableRecords.length; h++) {

    var uuid = new Date().getTime().toString(16) + Math.floor(1000*Math.random()).toString(16)
    //alert('set uuid: ' + uuid);
    //ユニークIDをセット
    tableRecords[h].value['unique_id'].value = uuid;

    var add_record = {
        'xxxx' : { "value": record.xxxx.value },
        'zzzz' : { "value": record.zzzz.value },
        'yyyy': { "value": tableRecords[h].value['yyyy'].value },
        .....
        .....
    };
    addRecords.push(add_record);
    console.log("add_record:"+add_record);
}
var add_body = {
    "app": item_app,
    "records": addRecords
};
console.log("add_body"+add_body);
kintone.api(kintone.api.url('/k/v1/records', true), 'POST', add_body ,function (resp) {
// success
console.log(resp);
//alert("ok"+JSON.stringify(resp));
}, function(error) {
// error
console.log(error);
//alert("NG"+JSON.stringify(resp));
});
//alert(JSON.stringify(add_body));
return event;
});
・・・・・

b-damaにより編集されました
0
Avatar
江田篤史

b-dama様

お世話になっております。

こちらで試してみましたが,登録失敗するような状況が再現できず,原因がわかりませんでした.
申し訳ござません.

REST APIでエラーが出ている可能性があるので,下記のようにするとエラーを確認しやすいかと思います.

kintone.api()のコールバック関数を省略して呼び出すとkintone.Promiseオブジェクトを返します.(参考)
kintone.events.on()のコールバック関数内で,eventオブジェクトを直接returnするのではなく,コールバック関数を省略したkintone.api()をreturnすると,REST APIの処理を待つことができます.
そして,kintone.api()のチェーンメソッドのthen()やcatch()のコールバック関数内でeventオブジェクトをreturnすると,REST APIの処理後にeventオブジェクトを返すことができます.
コンソールを確認するため,すぐに画面遷移しないように,event.errorをセットしておくと良いと思います.

function () {
  "use strict";
  kintone.events.on(['app.record.create.submit'], function (event) {
    ..........
    return kintone.api(kintone.api.url('/k/v1/records', true), 'POST', add_body).then(function (resp) {
      // success
      console.log(resp);
      // alert("ok"+JSON.stringify(resp));
      return event;
    }).catch(function (error) {
      // error
      console.log(error);
      // alert("NG"+JSON.stringify(error));
      event.error = 'error';
      return event;
    });
  });
  ..........
})();
0
Avatar
b-dama

江田さま

確認いただきありがとうございます!!
エラーを確認しやすいソースまで教えていただいて感謝です。

原因がわからないですよね・・・TT
同時接続数も出力させてみたのですが、ぜんぜん大丈夫でしたし。。。
もうちょっとねばって何度もやってみます。

また何かお気づきになりましたら教えてください><
ありがとうございました。


0
ログインしてコメントを残してください。