从 DTO 更新文档的简单方法?
Simple way to update document from DTO?
我的用户端点有这个快速代码。我想知道是否有更优雅的方式来为用户实现更新,我可以像在创建时那样传递 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});
}
});
};
您可以将 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
中间件仅传递应更新的字段,确保只有那些字段得到更新。
您可以使用下划线 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);
我的用户端点有这个快速代码。我想知道是否有更优雅的方式来为用户实现更新,我可以像在创建时那样传递 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});
}
});
};
您可以将 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
中间件仅传递应更新的字段,确保只有那些字段得到更新。
您可以使用下划线 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);