【问题标题】:Mongoose: updating item through POST JSONMongoose:通过 POST JSON 更新项目
【发布时间】:2014-02-09 20:16:19
【问题描述】:

我有编辑一些模型的管理页面。当我得到模型时,我将其转换为 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, ...

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

【问题讨论】:

    标签: json node.js express mongoose


    【解决方案1】:

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

    编辑:

    另外,如果您将 bodyParser 中间件与 Express 一起使用,则无需自己解析 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
      });
    
    });
    

    【讨论】:

    • 如何通过'result'变量做到这一点?
    • 简称delete result._id。现在一切正常!
    • 是的——我也将它添加到我的编辑中。很高兴为您提供帮助!
    • 所以mongoose不提供调试系统?不幸的是它没有像mysql那样显示mongodb错误。
    • 确实如此——#update() 回调中的 err 参数应该包含您要查找的错误。不幸的是,您使用通用字符串“error”覆盖,而不是将err 对象记录到控制台或通过req.send(err) 发送回客户端
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 2017-05-06
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多