【问题标题】:Node js updating a value returns null节点js更新值返回null
【发布时间】:2017-03-20 20:25:38
【问题描述】:

我正在尝试使用 express 和 node js API 调用来更新值。这是我的路线的样子:

var express = require('express');
var router = express.Router();

router.put('/updateValue/:id', function(req, res, next) {
  value.findByIdAndUpdate(req.params.id, req.body, {
    new: true
  }, function(err, post) {
    if (err) {
      res.json('value with the entered ID does not exist');
      console.log(err);
    } else {
    res.json(post);
  }
  });
});

这就是我的价值模式的样子:

var value = new mongoose.Schema({
    milliseconds: {
        type: Number
    }
});

我可以添加一个效果很好的值。

什么有效:

  • 使用正确的 id 更新值
  • 使用较短的 ID 更新值会返回错误(如预期的那样)
  • 使用更长的 ID 更新值会返回错误(如预期的那样)

什么不起作用:

  • 当我尝试使用相同长度的 ID 更新值,但更改了一个或两个数字时,我会在“post”中返回 null

它不应该也返回错误吗?由于 ID 不正确导致值没有更新?

任何解释将不胜感激!

【问题讨论】:

  • 嗨 deeveeABC,您是否检查过您的收藏以查看其中是否插入了新值?
  • 嘿。当我第一次添加它时,该值插入得很好。但是,当我尝试使用不正确的 ID 修改它时,它不会在 dbs 中更新。如果 ID 正确,则在 dbs 中正确更新值

标签: javascript node.js mongodb mongoose


【解决方案1】:

根据mongoose doc,如果你使用 new: true 修饰符,如果 mongo 没有找到你的文档,你将得到一个空结果。

这不是错误,而是功能。

【讨论】:

    【解决方案2】:
    if (err) {
          res.json('value with the entered ID does not exist');
          console.log(err);
        }
    

    只有当猫鼬抛出错误时才会运行上述代码

    • 使用较短的 ID 更新值会返回错误(如预期的那样)

    • 使用更长的 ID 更新值会返回错误(如预期的那样)

    在控制台中,您会收到如下消息:Cast to ObjectId failed for value

    但是,当您使用正确格式的 objectId 但使用数据库中不存在的值发送请求时 update 查询将返回 null。

    更新时你首先找到文档然后更新它,但如果文档不存在,这不是错误。

    你可以这样写代码:

     router.put('/updateValue/:id', function(req, res, next) {
      value.findByIdAndUpdate(req.params.id, req.body, {
        new: true
      }, function(err, post) {
        if (err) {
          res.json(err);
          console.log(err);
        } else {
             if(post){
               res.json(post);
               }else{
                   res.json('value with the entered ID does not exist');
                    }
             }
      });
    });
    

    在我的建议中,我们在请求中接受的所有内容都必须在进行数据库调用之前进行验证。因为从 mongoose 获取错误并不是编写 api 的好方法。

    因此,在您的情况下,您可以验证 req.params.id 是否为 ObjectId

    验证示例:

        var mongoose = require('mongoose');
        function validate(req.params.id){
        var data=req.params.id;
       return  mongoose.Types.ObjectId.isValid(data) ? null : 'Should be an object id.';
        }
    

    这只是一个功能示例,您可以根据自己的代码修改和使用它。

    【讨论】:

    • 这是一个很好的解释,但最后我有点困惑。我应该将验证功能放在我的 router.put 中的什么位置?
    • 如果遇到错误发送您的响应消息,您可以将它放在 value.findByIdAndUpdate 之前。
    • 您介意编辑您的代码以便将这两者集成吗?我是 Node 新手,我知道它使用回调来控制流程,所以只是想知道这看起来如何集成在一起。谢谢
    猜你喜欢
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2019-03-06
    • 2018-08-31
    • 2012-06-15
    相关资源
    最近更新 更多