余烬保存呼叫不会进入成功阻止

时间:2018-08-27 21:32:26

标签: javascript ember.js

我正在模型上使用ember save调用来持久保存并调用我的REST调用。

_model.save().then(() =>{
   console.log("success");
 }, (error) {
    console.log("error");
 });

我的REST api返回202响应(在“网络”选项卡上看到),在控制台上,我总是看到“错误”被打印出来。余烬中是否有任何东西将202视为错误?如果是,如何解决?

4 个答案:

答案 0 :(得分:2)

Ember Data尝试针对某些状态代码(包括202)将响应正文解析为JSON。空字符串不是有效的JSON。因此,正如您在某些评论中提到的那样,它将引发错误:

  

SyntaxError:“ JSON.parse:第1行第1列的数据意外结束   JSON数据”

由于引发,save()返回的Promise被拒绝。

您有两个选择:

  • 从您的后端返回有效的JSON。
  • 更改Ember Data的默认行为,使其不将202响应解析为JSON。

请注意,{}是有效的JSON,但不符合JSON API规范:

  

JSON对象必须位于每个JSON API请求的根,并且   包含数据的响应。该对象定义了文档的“顶部   级别”。

     

文档必须至少包含以下顶级文件之一   成员:

     
      
  • 数据:文档的“主要数据”
  •   
  • 错误:错误对象数组
  •   
  • meta:包含非标准元信息的元对象。
  •   

答案 1 :(得分:1)

我更喜欢使用本机的Promise挂钩,例如:

model.save()
  .then((idk) => {
     console.log('idk', idk);
  })
  .catch(error => {
     console.error(error);
  });

或者如果您有能力使用异步/等待:

   try {
     await model.save();
   } catch (error) {
     console.error(error);
   }

这两个代码片段都将告诉您为什么有错误(如果有错误:)

答案 2 :(得分:1)

这取决于您要实现的目标。如果您的template.hbs有类似的东西

  {{#each model as |myModel|}}
    <tr>
      <td {{action 'saveMe' myModel}}> {{myModel.someAttribute}} </td>
  </tr>
 {{/each}}

然后,您的controller.js应该看起来像这样

actions: {
  saveMe(myModel) {
    return myArgument.save().then(() => {
      console.log('foo success');
    }).catch(errors => {
      console.log('bar error');
    });
  }
}

该操作是保存要更改的属性值的更改。

答案 3 :(得分:0)

似乎已解决问题。我的回答是空白,因此ember将其扔到了错误响应中。即使使用202响应,后端也应该返回一些内容,或者必须重写应用程序适配器中的handleResponse方法。