Параметры Backbone.js / express.js для model.save ()

Я использую 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 :

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/


Вы также можете отправить запрос PATCH, если вы используете поддерживающую его версию Backbone (> = 0.9.9), и ваш сервер понимает этот глагол, как объясняется в ответе @ pkyeck

с текущей версией Backbone (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. ... });