从DTO更新文档的简单方法?

时间:2015-03-10 15:39:58

标签: node.js mongodb express mongoose

我的用户端点有这个快速代码。我想知道是否有一种更优雅的方式来为用户实现更新,我可以像在创建时那样将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});
        }
    });
};

2 个答案:

答案 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传递与文档的字段名称匹配的对象,就像创建用户时一样。

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