6

我在客户端上使用 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

非常感谢任何帮助!

4

3 回答 3

12

Model.save 文档中所述:

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

但是,您可以覆盖 save 方法并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 的回答中所述

于 2012-07-17T12:48:02.413 回答
3

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

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

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

在你的情况下,这将是:

book.save("author", "Teddy", {patch: true});
于 2014-02-11T10:08:33.187 回答
0

我发现访问 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.
  ...
});
于 2012-07-21T17:00:29.743 回答