Mongoose:通过POST JSON更新项目

时间:2014-01-20 15:25:39

标签: json node.js express mongoose

我有管理页面,编辑了一些模型。当我得到模型时,我将其转换为JSON并获得如下内容:

{
    "__v": 0,
    "_id": "52d919c7ec31cffc17477767",
    "description": "Hello, teached",
    "points": 1300,
}

这是我的玉石模板

form(role='form', method='post', action='/admin/item')
            .form-group
                textarea.form-control#result(rows='20', name='result') !{JSON.stringify(item, null, '\t')}
            input.btn.btn-primary(type='submit', value='Send')

这是我的路由器代码

app.post('/admin/item', function (req, res) {
    result = JSON.parse(req.body.result);
    Item.update({_id: result._id}, result, function (err, result) {
        if (err) {
            res.send('error');
        } else {
            res.send(result, 200);
        }
    });
});

我总是收到错误,但是当我手动更新每个字段时,就像这样:

result = JSON.parse(req.body.result);
Item.update({_id: result._id}, {description: result.description, ...

它神奇地更新。我做错了什么?

1 个答案:

答案 0 :(得分:3)

您需要从_id对象中删除result字段,否则Mongoose会假设您尝试从字符串而不是_id转换ObjectID字段。您还希望这样做,因为我假设每次更新文档时都更新_id可能不是您想要的行为。

编辑:

此外,如果您使用Express的bodyParser中间件,则无需自行解析JSON。 req.body应该从POST请求的主体返回一个已解析的对象文字。话虽如此,将路由器更改为这样可以使工作正常:

app.post('/admin/item', function (req, res, next) {

  var id = req.body.result._id;
  delete req.body.result._id;

  Item.update({_id: id}, req.body.result, function (err, numAffected) {
    // Do something after update here
  });

});