Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点js更新值时返回null_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 节点js更新值时返回null

Javascript 节点js更新值时返回null,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正在尝试使用express和NodeJSAPI调用更新一个值。这就是我的路线: 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,

我正在尝试使用express和NodeJSAPI调用更新一个值。这就是我的路线:

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
    }
});
这就是我的价值模式:

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不正确,该值不会更新

任何解释都将不胜感激

if (err) {
      res.json('value with the entered ID does not exist');
      console.log(err);
    }
上面的代码只有在mongoose抛出错误时才会运行,就像您的情况一样

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

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

在控制台中,您会收到这样的消息:值转换到ObjectId失败

但是,当您发送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.';
    }
这只是一个可以根据代码修改和使用的函数示例。

根据,如果使用new:true修饰符,如果mongo找不到您的文档,您将得到一个空结果


这不是一个bug,这是一个功能。

Hi deeveeABC,你检查过你的收藏了吗,看是否有新的值插入其中?嘿。当我第一次添加该值时,该值可以很好地插入。但是,当我试图用不正确的ID修改它时,它不会在dbs中更新。如果ID是正确的,那么DBS中的值会正确更新,这是一个很好的解释,但是最后我有点困惑。我应该在我的router.put中的何处放置validate函数?您可以将它放在value.findByIdAndUpdate之前,如果收到错误,请发送您的响应消息。您是否介意编辑您的代码,以便将两者集成在一起?我不熟悉Node,我知道它使用回调来控制流,所以我想知道这看起来是如何集成在一起的。谢谢