model.save()的Backbone.js / express.js参数

时间:2012-07-17 12:19:10

标签: node.js backbone.js express

我在客户端上使用Backbone.js,在后端使用node.js,我在执行“有限”模型保存时遇到了一些麻烦,如下所述:http://backbonejs.org/#Model-save

如示例所示,如果我

book.save({author: "Teddy"});

如何使用express.js访问save的参数,即我只想保存到'author'字段?我试过以下

req.body -> gives ALL parameters of the model being saved, I want only the 'author' field
req.query -> empty

任何帮助非常感谢!

3 个答案:

答案 0 :(得分:12)

Model.save documentation中所述:

  

保存 model.save([attributes],[options])
  [...]属性hash(如set中所示)应包含您要更改的属性 -   未提及的密钥不会被更改 - 但完成   资源的表示将被发送到服务器。

但是,您可以覆盖保存方法,并通过将发送到服务器而不是完整模型表示的选项提供data属性。例如,这只会保存传递给方法的属性:

var M = Backbone.Model.extend({   
    save: function (attrs, options) {
        options || (options = {});

        options.contentType = 'application/json';
        options.data = JSON.stringify(attrs);

        Backbone.Model.prototype.save.call(this, attrs, options);
    }
});

小提琴http://jsfiddle.net/dLFgD/


正如@mikebridge在评论中指出的那样,现在可以通过传递attrs选项来获取此行为。所以要么使用

book.save(null, {
    attrs: {author: "Teddy"}
});

或保留覆盖

var M = Backbone.Model.extend({
    url: '/echo/json/',

    save: function(attrs, options) {
        options || (options = {});      
        options.attrs = attrs;
        Backbone.Model.prototype.save.call(this, attrs, options);
    }
});

http://jsfiddle.net/nikoshr/dLFgD/7/


如果您使用支持它的Backbone版本(> = 0.9.9)并且您的服务器将该动词理解为explained in @pkyeck's answer

,您也可以发送PATCH请求

答案 1 :(得分:3)

使用当前版本的Backbone(1.1.0),您还可以执行PATCH,它只会将更改的属性发送到服务器。

  

相反,如果您只想将更改后的属性发送到服务器,请致电model.save(attrs, {patch: true})。只有传入的属性,您将收到服务器的HTTP PATCH请求。

取自此处:http://backbonejs.org/#Model-save

在你的情况下,这将是:

book.save("author", "Teddy", {patch: true});

答案 2 :(得分:0)

我发现访问POST参数的最佳方法是使用bodyParser中间件。这个问题引用了这个问题:How to retrieve POST query parameters?

/* On startup, register the bodyParser middleware */
app.use(express.bodyParser());

/* Then, during route execution, each parameter can be accessed with req.param */
app.post('/author/:id', function(req, res) {  
  var author = req.param('author', null); // Second parameter is default.
  ...
});