我的用户端点有这个快速代码。我想知道是否有一种更优雅的方式来为用户实现更新,我可以像在创建时那样将mongo传递给DTO,而不是单独填充字段。 mongoose是否有办法用DTO中的值填充现有文档,因为我不能像在create中那样使用构造函数?
exports.updateUser = function(req, res) {
User.findOne({ name: req.params.name }, function(err, user) {
if (err) { res.send(err); }
//way to use DTO like create?
if(req.body.profile.zipCode) { user.profile.zipCode = req.body.zipCode; }
user.save(function(err) {
if (err) { res.send(err); }
else {
res.json(user);
}
});
});
};
exports.createUser = function(req, res) {
var user = new User(req.body);
user.save(function(err) {
if (err) { res.send(err); }
else {
res.json({message: 'User added!', data: user});
}
});
};
答案 0 :(得分:1)
您可以将findOneAndUpdate
与$set
运算符一起使用:
exports.updateUser = function(req, res) {
User.findOneAndUpdate({ name: req.params.name }, { $set: req.body }, function(err, user) {
if(err) {
console.log("Something bad happened along the way");
}
res.json({message: 'Successfully updated user.'});
});
}
为了使其正常工作,您需要通过req.body
传递与文档的字段名称匹配的对象,就像创建用户时一样。
例如,如果用户仅更新其name
和email
,则您通过req.body
的对象应具有以下结构:
{
name: 'UpdatedName',
email: 'email@updated-address.com'
}
只传递应通过body-parser
中间件更新的字段,确保只更新这些字段。
答案 1 :(得分:0)
您可以使用效用函数(例如下划线的extend
)将req.body
中的所有值应用到文档中:
var _ = require('underscore');
exports.updateUser = function(req, res) {
User.findOne({ name: req.params.name }, function(err, user) {
if (err) { res.send(err); }
_.extend(user.profile, req.body);
user.save(function(err) {
if (err) { res.send(err); }
else {
res.json(user);
}
});
});
};
但是,最好首先清理req.body
以删除您不希望允许用户自行设置的任何配置文件属性。例如,如果用户的id也存储在配置文件中,您不希望允许他们更改它:
delete req.body.userId;
_.extend(user.profile, req.body);