1

我在使用 Mongoose 从查找中更新文档时遇到问题。只有当我尝试用一​​个对象(例如 doc = req.body)覆盖文档时,才会出现问题。但是,我可以直接将原始文档的属性设置为特定的字符串(例如 doc.name = 'jasonborne';)。

我已经验证 res.body 是一个对象,所以我不明白为什么我不能这样设置它。

Client.findById(req.params.client_id, function (err, client) {

    if (err)
        return next(new restify.InternalError(err));

    // client.name = 'jason borne';

            client = req.body;

    client.save(function(err) {

        if (err)
            return next(new restify.InternalError(err));

        res.send(client);

    });

});

尝试将文档设置为对象时,我收到错误消息:

TypeError: Object # has no method 'save'

我知道我可以使用简单的 Client.update(...) 命令进行更新,但是这种方法不允许我的模式中间件或验证运行(在Mongoose 文档中注明)。

有什么想法吗?我是 Node 和 Mongoose 的新手。

4

2 回答 2

2

您现在得到的症状是由于您正在替换 mogoose 模型对象(使用 save、find 等方法),由从您的身体解析的一个简单 json 对象(缺少save.

尝试进行更新而不是查找/保存。

 Client.update({_id: req.params.client_id}, {$set : req.body}, function(err) {...});

或者尝试将您req.body的对象合并到client对象中。

于 2013-01-15T21:19:02.443 回答
2

您需要使用类似下划线的extend方法将 的属性复制req.body到对象中,而不是像现在client一样重新指向clientreq.body

var _ = require('underscore');
Client.findById(req.params.client_id, function (err, client) {

    if (err)
        return next(new restify.InternalError(err));

    _.extend(client, req.body);
    client.save(function(err) {
        if (err)
            return next(new restify.InternalError(err));
        res.send(client);
    });
});
于 2013-01-15T21:26:34.207 回答