销毁记录时出现Ember.js错误

销毁记录时出现Ember.js错误,ember.js,ember-data,Ember.js,Ember Data,我试图破坏一个记录,但我得到了这个错误 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

我试图破坏一个记录,但我得到了这个错误

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.
我的RESTAPI返回一个带有空对象响应的
200
状态代码
{}
。我假设这就是问题所在,所以我一直在尝试自定义几个序列化程序挂钩(
normalizedeletererecordresponse
extracteddeletererecord
,甚至只是
normalizeResponse
),但这些挂钩都没有被实际调用


查看我的堆栈跟踪,错误似乎出现在
didsavecord
hook中,我假设它正在接收空的JSON负载,并将其传递给
updateId

用于
delete
的API应返回204个状态代码用于
delete
的API应返回204个状态代码用于余烬数据的默认适配器符合规范,因此当(或规范中所称的资源)如果返回其他元数据(必须位于名为
meta
的节点中),则应返回
204无内容
响应(无内容)或
200 OK
)。仅返回带有
200 OK
的空对象在规范中是无效的,您最好的解决方案是修复rest api以遵循规范

现在,如果这完全不可能,您可以通过基于
JSONAPIAdapter
创建一个自定义适配器,然后重写
deleteRecord
,来解决这个问题。根据以下内容,可能会出现类似的情况:


Ember数据的默认适配器遵循规范,因此当(或规范中调用的资源)返回
204无内容
响应(无内容)或
200 OK
时,如果返回其他元数据(必须位于名为
meta
的节点中),则应返回。仅返回带有
200 OK
的空对象在规范中是无效的,您最好的解决方案是修复rest api以遵循规范

现在,如果这完全不可能,您可以通过基于
JSONAPIAdapter
创建一个自定义适配器,然后重写
deleteRecord
,来解决这个问题。根据以下内容,可能会出现类似的情况:


非常感谢!这很有效,除了
Object.keys(响应).length
。我快疯了。但这对我来说有点不直观。如果你不介意的话,你能澄清一下:我假设适配器会调整发送到服务器的数据,使其符合后端的预期,而序列化程序会调整服务器的数据,使其符合Ember的预期。这就是我为什么要查看序列化程序的原因。我丢失了吗有什么吗?我可以在哪里找到所有这些钩子的运行顺序?适配器和序列化程序都处理Ember数据中的传入和传出数据。适配器是处理与api通信的通信层,可以通过xhr、websockets或其他任何方式。它返回的是一个承诺,返回data作为对象传递给序列化程序,序列化程序将其转换为。在退出时,序列化程序将转换记录(或其快照)回到适配器然后发送到api的常规对象。我快速浏览了文档和存储库,找到了关于余烬数据顺序的任何好东西,我能想到的最好的办法是:它没有考虑序列化程序。Tack såmycket为您提供解释!现在更清楚了,尽管我想我很高兴能更清楚地了解钩子等的执行顺序。我认为文档在这方面有点欠缺。再次感谢您提供的资源。非常感谢!这很有效,除了
Object.keys(响应).length
。我快疯了。但这对我来说有点不直观。如果你不介意的话,你能澄清一下:我假设适配器会调整发送到服务器的数据,使其符合后端的预期,而序列化程序会调整服务器的数据,使其符合Ember的预期。这就是我为什么要查看序列化程序的原因。我丢失了吗有什么吗?我可以在哪里找到所有这些钩子的运行顺序?适配器和序列化程序都处理Ember数据中的传入和传出数据。适配器是处理与api通信的通信层,可以通过xhr、websockets或其他任何方式。它返回的是一个承诺,返回data作为对象传递给序列化程序,序列化程序将其转换为。在退出时,序列化程序将转换记录(或其快照)回到适配器然后发送到api的常规对象。我快速浏览了文档和存储库,找到了关于余烬数据顺序的任何好东西,我能想到的最好的办法是:它没有考虑序列化程序。Tack såmycket为您提供解释!现在更清楚了,尽管我想我真的很享受钩子执行顺序的清晰。我认为文档在这方面有点欠缺。再次感谢您提供的资源。
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;
    });
}