2016-07-10 3 views
0

を破壊しながら、私は、レコードを破壊しようとしていると私はEmber.jsエラー記録

An adapter cannot assign a new id to a record that already has an id. 
[…] had id: 25 and you tried to update it with null. This likely happened because 
your server returned data in response to a find or update that had a different 
id than the one you sent. 

このエラーを取得する私のREST APIは空のオブジェクトの応答{}200ステータスコードを返します。私はその問題がどこにあるかを想定しているので、いくつかのシリアライザフック(normalizeDeleteRecordResponseextractDeleteRecord、さらにはnormalizeResponse)をカスタマイズしようとしていますが、それらのどれも実際に呼び出されることはありません。

私のスタックトレースを見れば、エラーはフックにあるようですが、これは空のJSONペイロードを受け取り、それをupdateIdに渡していると考えられます。

答えて

4

エンバーデータのデフォルトのアダプタはJSON API仕様を次のようにdeleting a record(またはそれらが仕様で呼ばれているようリソース)を使用すると、コンテンツなし(204 No Content応答を返すべきとき(metaという名前のノード内にある必要があります)を返す場合は、です。 200 OKで空のオブジェクトを返すだけでは仕様に誤りがあり、最適な解決策は残りのAPIを仕様に準拠させることです。

これが完全に不可能な場合は、JSONAPIAdapterに基づいてカスタムアダプタを作成し、deleteRecordを上書きすることでこれを修正できます。 default implementation

deleteRecord(store, type, snapshot) { 
    var id = snapshot.id; 

    return this.ajax(this.buildURL(type.modelName, id, snapshot, 'deleteRecord'), "DELETE") 
    .then(response => { 
     if(Object.keys(response).length === 0) { 
     return null; // Return null instead of an empty object, this won't trigger any serializers or trying to push new data to the store 
     } 
     return response; 
    }); 
} 
+0

ありがとうございました。これは 'Object.keys(response).length'を除いて動作します。私は狂っていた。しかし、これは私には直感的ではありません。もしあなたが気にしないのなら、これを明確にすることができます:私は、アダプターがバックエンドが期待しているように**サーバーに送る**アダプターを*適応させると仮定しました。シリアライザーは* Emberが期待しているようにサーバーを作る*。だから私はシリアライザーを見ていたのです。何か不足していますか?これらのフックがすべて実行される順序を見つけることができる場所はありますか? – Sunyatasattva

+1

アダプタとシリアライザは両方とも、Ember Dataの受信データと送信データの両方で動作します。アダプターは、xhr、websockets、または何かを経由してapiとの通信を処理する通信レイヤーです。それが返すのは、シリアライザに渡されるオブジェクトとしてのデータを返す約束です。これは、それを[DS.Model](http://emberjs.com/api/data/classes/DS.Model.html)に変換します。 。途中でシリアライザは、レコード(または実際にはそのスナップショット)をアダプタがAPIに送信する通常のオブジェクトに戻します。 –

+1

私は、ドキュメントとリポジトリを見て、Ember Dataと私が考え出すことができる順序について何か良いものを見つけました。[architecture-overview](https://guides.emberjs.com/v2) .6.0/models /#toc_architecture-overview) シリアライザを考慮に入れません。 –

0

deleteのためのあなたのAPIが返す必要があります204ステータスコード

関連する問題