ステータス更新を行うとエラーになる

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

 

タイトルの通りなのですが、REST APIを用いてステータスの更新(1行ずつ)を行うと、「不正なリクエスト」となり、エラーになってしまいます。

まったく同じ組織・作業者に対しておよそ150件ほどのレコードでを更新すると1、2件(その時によって違う)だけが

「不正なリクエスト」となり、レコードの更新が行えません。

 

また、30件のレコードで更新しても同様に2件(最初の2件が更新失敗)

3件で更新した場合には(最初の1件が更新失敗) となります。

 

それ以外は全て正常にステータスが更新されています。

 

ご教授頂ければ幸いです。

 

<code>

kintone.events.on(“app.record.index.show”, function(e) {
$(“#process_confirm_btn”).on(“click”, confirmProcess);
});
function confirmProcess(e) {
swal({
title: “確認依頼を行いますか?”,
text: “ステータスの更新処理には時間が掛かる場合があります”,
type: “warning”,
showCancelButton: true,
confirmButtonColor: “#DD6B55”, // ボタンカラー
confirmButtonText: “更新する”,
cancelButtonText: “中止する”,
closeOnConfirm: true
}).then(function() {
showSpinner();
createConfirmProcess().then(function() {
if (details.length > 0) {
swal({
title: “更新しました”,
text: “OKボタンを押してください。”,
type: “success”,
showCancelButton: false,
closeOnConfirm: true
}).then(function () {
hideSpinner();
window.location.reload();
});
} else {
swal(“更新件数がありませんでした。”, “確認中のステータスのレコードは存在しませんでした。”, “warning”);
hideSpinner();
}
});
}, function (dismiss) {
if (dismiss === “cancel”) {
swal(“中止しました”, “OKボタンを押してください”, “success”);
} else {
swal(“中止しました”, “ボタン押下以外で中止されました。”, “error”);
}
});
}

function createConfirmProcess() {
return 全件取得メソッド().then(function(allRecords) {
details = allRecords;
var params = null;
return kintone.Promise.all($.map(details, function(item, index) {
var supplier_code = item[“SUPPLIER_CODE”].value;
params = {
code : supplier_code
};
return kintone.api(kintone.api.url(‘/v1/organization/users’, true), ‘GET’, params).then(function(org_resp) {
if (org_resp.userTitles.length === 0) {
console.log(“紐付く組織が存在しません。”);
} else {
var update_id = item[“$id”].value;
var revision_id = item[“$revision”].value;
console.log(user_code1 + " " + user_code2);
return makerConfirmStatusUpdateParam(update_id, revision_id);
}
});
}));
});
}

var makerConfirmStatusUpdateParam = function(update_id, revision_id) {
var saveParams = {
“app” : kintone.app.getId(),
“id” : update_id,
“action” : STATUS_ACTION_NAME.STATUS_CONFIRM,
“revision” : revision_id
};
return kintone.api(“/k/v1/record/status”, “PUT”, saveParams).then(function(status_resp) {
console.log(status_resp);
console.log(“更新完了”);
}).catch(function (error) {
console.log(error);
});
}

</code>

 

以上、

宜しくお願い致します。

鈴木佑介さん

 

端的に申し上げますと、経験上kintoneのREST APIのリクエストでPUTメソッドの同時処理はその幾つかが落ちます。これはレコード操作、スペース操作等に関わらずですし、また同じレコードに同じ処理を同時にやっているからというわけでもありません。

 

この前の 2016年5月のアップデート

 

修正されるエラーメッセージ

  • レコード一括更新を並列実行した際のメッセージを適切(わかりやすく)に修正
    改修前:「不正なリクエストです。」 
    改修後:「レコードの更新が複数同時に行われたため、レコードの更新に失敗しました。時間をおいて再度お試しください。」

 

といった項目がありましたが、これと同じだと思います(恐らくPUT/recordsはやる人が多いのでエラーメッセージを明示したのでしょう)。

 

対応はそのままですが、パラレル処理からシリーズ処理への変更になると思います。確認を込めて試行されると良いかと思います。

鈴木佑介さん
cstapの瀧ヶ平です

更新自体の実行は行われてるようなので、おそらく送っている値に問題があるか、kintone側の仕様などの問題かと思います。
よろしければ可能な範囲で良いので失敗している際に送っているパラメータと成功している場合のパラメータの比較など教えて頂けると問題の切り分けがしやすいかと思います。

Ryu Yamashitaさん

 

ご回答ありがとうございます。

>端的に申し上げますと、経験上kintoneのREST APIのリクエストでPUTメソッドの同時処理はその幾つかが落ちます。これはレコード操作、スペース操作等に関わらずですし、また同じレコードに同じ処理を同時にやっているからというわけでもありません。

 

なるほど。。。そうなのですね。

 

すいません、

>シリーズ処理

こちらの意味がよくわからなかったので、ご教授頂ければ幸いです。

宜しくお願い致します。

 

 

瀧ヶ平さん

 

ご返信ありがとうございます。

>kintone側の仕様などの問題

上記は山下さんも仰って頂いている問題という認識で宜しかったでしょうか?

 

>可能な範囲で良いので失敗している際に送っているパラメータと成功している場合のパラメータの比較

上記すぐに出せないので、改めてこちらにコメント残させて頂きます。

 

ありがとうございます。

>>シリーズ処理

>こちらの意味がよくわからなかったので、ご教授頂ければ幸いです。

 

kintone.Promise.all() と $.map() で並列実行になっている複数処理を、reduce() 等を利用して直列or順次実行に変えるという意図です。

Ryu Yamashita さん

 

>kintone.Promise.all() と $.map() で並列実行になっている複数処理を、reduce() 等を利用して直列or順次実行に変えるという意図です。

ご教授ありがとうございます!

試してみます!