NIFCLOUD-mbaas / ncmb_js

ニフクラ mobile backend JavaScript SDK
https://mbaas.nifcloud.com
Other
28 stars 27 forks source link

データストアに未定義のクラスのインスタンスを同時に複数保存しようとするとエラーになる #191

Closed bkzen closed 6 years ago

bkzen commented 6 years ago

環境:

詳しい条件:

起こる現象:

出力されたエラー内容は以下の通り:

{ Error: cannot POST /2013-09-01/classes/Food (409) at Response.toError (/Users/pbi06455/node_modules/superagent/lib/node/response.js:106:13) at Response.setStatusProperties (/Users/pbi06455/node_modules/superagent/lib/node/response.js:183:12) at new Response (/Users/pbi06455/node_modules/superagent/lib/node/response.js:42:8) at IncomingMessage. (/Users/pbi06455/node_modules/superagent/lib/node/index.js:918:22) at emitNone (events.js:110:20) at IncomingMessage.emit (events.js:207:7) at endReadableNT (_stream_readable.js:1057:12) at _combinedTickCallback (internal/process/next_tick.js:138:11) at process._tickCallback (internal/process/next_tick.js:180:9) status: 409, text: '{"code":"E409001","error":"Duplication Error"}', method: 'POST', path: '/2013-09-01/classes/Food' }

エラーが出たコードはドキュメントにある以下のソース:

var Food = ncmb.DataStore("food");
var food1 = new Food({name: "orange", type: "fruit"});
var food2 = new Food({name: "apple", type: "fruit"});
var relation = new ncmb.Relation();
relation.add(food1).add(food2);

var MainObj = ncmb.DataStore("MainObj");
var mainobj = new MainObj();
mainobj.set("foods", relation);

mainobj.save()
    .then(function(obj){
        console.log("done");
    })
    .catch(function(err){
        console.log(err);
    });

Monaca でテストした場合はエラーも起こらず、無事登録が行われた。

bkzen commented 6 years ago

この件について追記です。 Node.js のバージョンを推奨の v4.2.x で試しても同じでした。

また、コードを簡略化し、以下のコードを同一の条件(foodクラスが定義されていない状態)で実行した場合においても、同様のエラーコード 409001 が返ってきました。

    var Food = ncmb.DataStore("food");
    var food1 = new Food({name: "orange", type: "fruit"});
    var food2 = new Food({name: "apple", type: "fruit"});
    food1.save().then(console.log).catch(console.log);
    food2.save().then(console.log).catch(console.log);

どうやら リレーションは関係なく 、新規foodクラスを二つ作ろうとしてエラーが起きているようです。

monaca では上記のコードでもエラーは起きませんでしたが、帰ってきたデータの createDate が 200msほどずれていたので、試しに Node.js 側で上記のコードの food2.save()setTimeout() で 100msほど遅延させて実行したところ、エラーが出ませんでした。

bkzen commented 6 years ago

調査の結果、REST API を並列に二つたたいても同様の現象が起きたので SDK のバグというわけではない事がわかりました。 以下の理由からドキュメント側の修正を行うことで対応することとして、この issue はクローズします。別途ドキュメント側で issue を作成します。