错误"断言失败:在尝试规范化和推送时,在调用"push` /`update`时期望对象为`data`

Mar*_*ois 7 ember.js ember-data

在我的Ember应用程序中,我收到来自websocket的通知.当websocket收到一条消息(编码为JSON)时,我想将它推入商店.

到目前为止,这是我的代码:

console.log('About to normalize', data);
var normalizedData = this.store.normalize('message', data);
console.log('About to push', normalizedData);
this.store.push('message', normalizedData);
Run Code Online (Sandbox Code Playgroud)

data和normalizedData最终是完全相同的值,如下所示:

{"message":{"id":1,"chatroom":1,"player":1,"content":"A message"}}
Run Code Online (Sandbox Code Playgroud)

并调用push方法会引发此错误:

Error: Assertion Failed: Expected an object as `data` in a call to `push`/`update` for message ,
but was {"message":{"id":1,"chatroom":1,"player":1,"content":"31232132113"}}
Run Code Online (Sandbox Code Playgroud)

我不知道出了什么问题.当Ember从服务器获取特定消息时,它会收到相同类型的JSON,而Ember Data会很好地处理它.当它来自websocket并且需要被推动时,它会崩溃.

更新

我尝试使用pushPayload,就像在评论中提出的那样.它仍然无法正常工作.我收到这些消息:

"警告:在有效负载中遇到"0",但未找到型号名称为"0"的模型(使用arkipel @ serializer解析的型号名称:-rest:.typeForRoot("0"))"

"警告:在有效负载中遇到"0",但未找到型号名称为"1"的模型(使用arkipel @ serializer解析的型号名称:-rest:.typeForRoot("1"))"

"警告:在有效负载中遇到"0",但未找到型号名称为"2"的模型(使用arkipel @ serializer解析的型号名称:-rest:.typeForRoot("2"))"

它上升到67,然后继续使用像fmt,camelize,htmlSafe这样的词......我只是数据只是一个表示JSON的字符串.

jcb*_*bvm 9

我们在聊天中做了一些调试后发现了问题.我会在这里为其他人分享解决方案.

websocket以字符串格式发送消息.所以data在javascript代码中是一个字符串而不是javascript对象(JSON).Ember Data希望我们推送一个javascript对象而不是字符串.

解决方案是首先将来自websocket的响应解析为javascript对象,然后将其推入商店,例如通过执行JSON.parse(data).

  • 我们在pushPayload中遇到了类似的问题,它确实需要JSON对象.在我们的例子中,我们已经有了一个对象,但是pushPayload无法使用它.所以我们最终调用stringify然后解析以将我们的用户加载到商店中.它看起来像这样:`store.pushPayload('user',JSON.parse(JSON.stringify({user:authUser})));` (2认同)