从 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 传递一个与文档的字段名称匹配的对象,就像您在创建用户时所做的那样。

例如,如果用户仅更新他们的 nameemail,您通过 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);