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

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

正如在例子中,如果我这样做

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

如何使用express.js访问保存的参数,即我只想保存到“作者”字段的事实? 我试过以下

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

任何帮助非常感谢!

如Model.save文档中所述 :

保存 model.save([attributes],[options])
[…]属性哈希值(如在集合中)应该包含您想要更改的属性 – 未提及的密钥不会被更改 – 但是, 资源完整表示将被发送到服务器。

但是,您可以覆盖保存方法,并通过将发送到服务器的选项提供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),并且您的服务器理解该动词,您也可以发送PATCH请求,如@ pkyeck的答案中所述

与当前版本的骨干(1.1.0),你也可以做一个PATCH ,只发送更改的属性到服务器。

相反,如果您只想将已更改的属性发送到服务器,请调用model.save(attrs, {patch: true}) 。 您将只通过传入的属性获得HTTP PATCH请求到服务器。

从这里取: http : //backbonejs.org/#Model-save

在你的情况下,这将是:

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

我发现访问POST参数的最好方法是使用bodyParser中间件。 这是在这个问题引用: 如何检索POST查询参数?

 /* 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. ... });