我正在尝试使用 ember-data 获取一个简单的注册表单以保存在我的服务器上。从技术上讲,该调用是有效的,但成功回调永远不会在 promise 上触发,我不知道为什么。
服务器接收前端发来的数据,并成功保存到数据库。然后,它返回 CREATED 状态代码 201。我可以在 Chrome 调试器中看到成功的响应。但即使服务器以成功状态响应,也会在保存的 promise 上触发错误回调。我已经通过放置调试器确认每次都会发生这种情况;错误回调中的语句。
我的路由器型号是这样连接的:
model: function() {
return this.store.createRecord('registerUser');
}
我的 Controller 中有一个简单的注册函数:
register: function() {
var self = this;
this.get('model').save().then(function() {
self.transitionToRoute('index');
}, function(resp) {
if (resp.responseJSON) {
self.get('model').set('errors', resp.responseJSON.errors);
}
});
}
每次我的服务器返回响应时,无论成功还是失败,都会触发失败回调。如果我的响应中有错误(无效数据或其他内容),错误将成功显示在表单中。我可以看到请求正确传入,并且数据存储在数据库中。因此,保存在技术上是成功的,但 ember 似乎并不知道这一点,即使服务器返回了成功的 201 状态(可以在 Chrome 调试器中验证)。
我唯一能想到的是 ember-data 的适配器正在做一些我不知道的事情,但我只是使用默认的 RESTAdapter 并且没有触及它。还有什么吗
如果有影响,则服务器正在运行 Play 1.2.5。我不知道这是否会对响应的 header 或类似内容产生影响。
任何帮助将不胜感激。感谢您的宝贵时间!
迈克
解决方案
所以,问题与 JSON 响应有关。两个问题:
- 我没有在回复中添加 ID
- 我没有将响应“包装”在“registerUser”中。这是匹配型号名称所必需的。
以下是有效的回复:
{
"registerUser": {
"id": 11,
"email": "mike999@test.com",
"password": "12345",
"password2": "12345",
"name": "Mike"
}
}
最佳答案
Ember Data 期望响应中包含模型,因此发回成功的 http 状态并不意味着它将到达成功端点。当它尝试序列化您的响应(或缺乏响应)时,它可能会失败,这就是它遇到故障函数的原因。响应的一个重要原因是记录的 id
。
返回的模型应采用以下格式
{
registerUser:{
id: "123",
attr: "asdf"
}
}
关于ember.js - Ember-Data save() 从未触发成功回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21446352/