Node.js model.save()的Backbone.js/express.js参数
我在客户端使用Backbone.js,在后端使用node.js,在执行“有限”模型保存时遇到了一些问题,如下所述: 如示例中所示,如果我这样做Node.js model.save()的Backbone.js/express.js参数,node.js,backbone.js,express,Node.js,Backbone.js,Express,我在客户端使用Backbone.js,在后端使用node.js,在执行“有限”模型保存时遇到了一些问题,如下所述: 如示例中所示,如果我这样做 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.
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
非常感谢任何帮助 如中所述:
保存模型。保存([属性],[选项])[…]属性散列(如集合中所示)应包含要更改的属性- 未提及的键不会被更改-但是,完成 资源的表示形式将发送到服务器 但是,您可以覆盖保存方法,并通过将发送到服务器而不是完整模型表示的选项提供
数据
属性。例如,这将仅保存传递给方法的属性:
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);
}
});
和小提琴
正如@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);
}
});
如果您使用的是支持它的主干版本(>=0.9.9),并且您的服务器理解这个动词,那么您也可以发送补丁请求,因为我发现访问POST参数的最佳方法是使用bodyParser中间件。这是在本问题中提到的:
在当前版本的主干网(1.1.0)中,您还可以执行一个
补丁
,它只将更改的属性发送到服务器
如果您只希望将更改的属性发送到服务器,请调用model.save(attrs,{patch:true})
。您将获得一个到服务器的HTTP补丁请求,其中只包含传入的属性
摘自这里:
在您的情况下,这将是:
book.save("author", "Teddy", {patch: true});
谢谢@nikoshr,我看到了,但我认为有一种方法可以通过其他方式访问参数键。。。非常感谢!这真的很有帮助。我将此方法命名为另一个方法名称,以便用户可以调用此方法,并保留正常保存。如果您的服务器支持此方法,你可以做一个
补丁
——看我的,我想你现在可以通过将行设置options.contentType=…
和options.data=…
替换为一行来实现这一点:options.attr=attrs
。这个值在Backbone.sync中使用,它隐式地处理内容类型。@mikebridge感谢您指出这一点,我将它添加到了我的answerThank@bsorbo中,我遇到的问题是如何在服务器端(express.js)知道哪些字段已被选择由客户端(Backbone.js)更新,如果我只想更新某些字段,而不是全部字段。
book.save("author", "Teddy", {patch: true});