节点js更新值返回null

时间:2016-11-07 13:14:02

标签: javascript node.js mongodb mongoose

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

if ( isset($_POST['image_url'] ) && '' !== $_POST['image_url'] ) {
    update_option( $_POST['image_url'], 'image_url' );
}

这就是我的价值架构:

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);
  }
  });
});

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

什么有效:

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

什么行不通:

  • 当我尝试使用相同的长度ID更新值时,无论如何更改一两个数字 - 然后我在'var value = new mongoose.Schema({ milliseconds: { type: Number } }); '
  • 中返回null

它是否也不会返回错误?由于ID不正确,值未更新?

任何解释都将不胜感激!

2 个答案:

答案 0 :(得分:0)

if (err) {
      res.json('value with the entered ID does not exist');
      console.log(err);
    }

上面的代码只会在你的情况下像mongoose throw error

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

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

在控制台中,您收到以下消息:强制转换为ObjectId值

但是当您发送具有正确格式的objectId但具有数据库中不存在的值的请求时, 更新 查询将返回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.';
    }

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

答案 1 :(得分:-1)

根据mongoose doc,如果使用new:true修饰符,如果mongo找不到您的文档,则会得到null结果。

这不是一个错误,它是一个功能。