【问题标题】:Backbone.js save always triggers error even on success即使成功,Backbone.js 保存也总是会触发错误
【发布时间】:2014-03-11 01:37:18
【问题描述】:

我已阅读有关此问题的其他几篇文章,但似乎没有一个解决方案对我有用。我的视图中有以下代码:

  this.model.set({
      username: $('#user-username').val(),
      role: $('#user-role').val(),
      description: $('#user-description').val()
  });

  this.model.save({ user_id: this.model.get('user_id')}, {
    success: function(user, response) {
      console.log('success:', response);
      $('.flash-message').text("Success").show();
    }, 
    error: function(user, response) {
      console.log('error:', response);
      $('.flash-message').text(response.error).show();
    } 
  });

这在我的服务器控制器上(运行 express 3 的 nodejs):

UserController.prototype.updateAction = function(req, res) {
if (req.route.method != "put") {                              
    res.send({status: "error", error: "update must be put action and must include values"});
    return false;                                             
}
var query = {'user_id': req.params.id};                       
var user = req.body;
var userRepository = this.userRepository                      

// delete _id to avoid errors
delete user._id;

userRepository.update(query, user, {}, function(err, updated) {
    if ((err) || (!updated)) {
        res.send({"status": "error", "error": err});
        return false;
    }
    // send updated user back
    util.log('updated user ' + user.user_id);
    res.setHeader('Content-Type', 'application/json');
    res.status(200);
    res.send(JSON.stringify({"status": "success", "updated": updated}));
});

}

保存时,我的模型已正确保存在服务器中,并且我已使用 this 验证了服务器响应。因此,据我所知,服务器正在返回状态 200、有效的 JSON,以及有效的 JSON 响应标头。然而我的主干 model.save 函数总是触发错误回调。谁能告诉我为什么以及如何解决这个问题?

如果将 dataType 设置为这样的文本,我可以让它工作:

this.model.save({ user_id: this.model.get('user_id')}, {
    dataType: "text",
    success: function(user, response) {
      console.log('success:', response);
      $('.flash-message').text("Success").show();
    }, 
    error: function(user, response) {
      console.log('error:', response);
      $('.flash-message').text(response.error).show();
    }
  });

但是这样做不允许我从服务器获取响应。相反,我在响应变量中得到了这个:

success: {
  "_id": "5133b02062e15ed1d2000001",
}

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    Backbone 期望取回它在其 PUT 或 POST 请求正文中发送的模型。

    代替:

    res.send(JSON.stringify({"status": "success", "updated": updated}));
    

    在你的服务器响应中试试这个:

    res.json(user);
    

    【讨论】:

      【解决方案2】:

      您的呼叫可能已进入状态 200 连接已建立,主干检测为错误,只有当呼叫为 200OK 时,主干才会抛出成功。

      【讨论】:

        【解决方案3】:

        您的服务器代码是什么?您需要确保将 json 发送回骨干网,如下所示:

        //In your express POST route
        user.save(function(err) {
            if(err){
                console.log(err);
                return res.json(401);
            } else {
                console.log('user: ' +user.username + ' saved');
                return res.json(200);
            }
        

        然后在您的主干视图中,您可以检查响应并执行您需要的操作:

        //some function in your view
        this.model.save(this.formValues, {
                    success: function(model, response, options) {
                        if (response == 200) { 
                            console.log('success :' + response);
                            //Do stuff
                        } else {
                            console.log('error: '+response);
                        //etc.
        

        另请注意,根据骨干模型文档: "save 接受选项哈希中的成功和错误回调,将传递参数(模型、响应、选项)"

        【讨论】:

          猜你喜欢
          • 2021-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-28
          • 1970-01-01
          相关资源
          最近更新 更多