REST API POSTでのレコード登録失敗

アプリAのレコード登録成功時にアプリAのテーブルデータを、REST APIのPOSTにてアプリBのレコードに登録しています。

POSTする前にアプリBに同じレコードが無いかGETで調べ、あれば削除をしてからPOSTしています。

アプリBへのレコード登録やレコード削除は9割程度は成功しているのですが、たまにレコード登録や削除に失敗しています。

登録や削除を失敗する要因はどのような事が考えられますでしょうか?

毎回失敗するのであればコードに問題があるとわかるのですが、ほぼ成功しているので、原因がわかりません。

アプリAの使用頻度は60人ほどが頻繁に使用するといった感じです。

お手数をおかけいたしますが、アドバイスをいただけると助かります。

宜しくお願い致します。

 

因みにコードは下記になります。

 

(function() {
“use strict”;
kintone.events.on([
‘app.record.create.submit.success’,
‘app.record.edit.submit.success’
], function(event) {
return new kintone.Promise(function(resolve, reject) { //kintone.Promiseで非同期処理
// アプリAID取得
var appId = event.appId;
// レコード番号の取得
var recordId = event.recordId;
//アプリBにキーとして登録するアプリID + レコード番号
var keyNo = appId + “-” + recordId;
//レコード取得
var record = event.record;
//アプリBにレコードがあればDELETE
var params = {
“app”: 9,
“query”: “レコード_紐付け用 = " + “"” + keyNo + “"”,
“fields”: [”$id"]
}
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params).then(function(resp) {
// 成功時の処理
var delIds = new Array();
for (var i = 0; i < resp.records.length; i++) {
delIds.push(resp.records[i].$id.value)
}
console.log(resp.records);
if (delIds[0]) {
var body = {
“app”: 9,
“ids”: delIds
};
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘DELETE’, body).then(function(resp) {
console.log(resp);
resolve(event);
}, function(error) {
// error
console.log(error);
resolve(event);
});
} else {
resolve(event);
}
},
function(error) {
// エラー時の処理
console.log(error);
resolve(event);
});
var user = kintone.getLoginUser();
//アプリAのテーブルの行データをアプリBに登録
var tables = event.record.Table.value;
for (var i = 0; i < tables.length; i++) {
if(tables[i].value[“CHC_No”].value) {
var params = {
“app”: 9,
“record”: {
“訪問日”: { “value”: record[‘日付’].value },
“開始時刻”: { “value”: tables[i].value[“開始時刻”].value },
“顧客名”: { “value”: tables[i].value[“訪問先CHCオーナー名”].value },
“訪問者”: { “value”: user[‘name’] },
“訪問内容”: { “value”: tables[i].value[“業務内容”].value },
“顧客管理レコード番号_関連レコード一覧紐付け用”: { “value”: tables[i].value[“CHC_No”].value },
“日報レコード_紐付け用”: { “value”: keyNo }
}
};
// kintone REST API リクエスト ~ レコードの登録(POST)
kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘POST’, params).then(function(resp) { // - callback
//アプリBに登録成功
resolve(event);
},
function(resp) { // - errback
//アプリBに登録失敗
resolve(event);
}
);
}
}
});
});
})();

sunM様

お世話になっております。
cstapの江田と申します。

ご提示していただいたコードですと、処理の順序が下図のようにようになると思います。

POSTを呼ぶ前にDELETEが完了しresolveされることや、DELETEを呼ぶ前にPOSTが完了しresolveされることがあり得るため、POSTやDELETEが呼ばれないことがあるかと思います。
また、GETする前にPOSTされているといけないので、下図の順序にするとよいと思います。

コードとしては、POSTをDELETEと同様に、GETのthenの中に書くとよいと思います。
また、DELETEとPOSTの両方が完了してからresolveするにはPromise.all()を用いるとよいです。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

江田様

 

修正箇所のご指摘ありがとうございます。

ご教示いただいたように修正を行い、何度かテストをしてみたところ問題無く動作しております。

この状態でしばらく様子を見てみます。

私自身、もっとPromiseについての理解が必要と痛感しております。

迅速なご回答、有難うございました。