为了账号安全,请及时绑定邮箱和手机立即绑定

在路径“ _id”中,值XXX的猫鼬错误转换为ObjectId失败了吗?

/ 猿问

在路径“ _id”中,值XXX的猫鼬错误转换为ObjectId失败了吗?

幕布斯7119047 2019-09-21 11:42:22

发送请求到时/customers/41224d776a326fb40f000001,_id 41224d776a326fb40f000001不存在的文档,doc是,null并且我返回404:


  Controller.prototype.show = function(id, res) {

    this.model.findById(id, function(err, doc) {

      if (err) {

        throw err;

      }

      if (!doc) {

        res.send(404);

      }

      return res.send(doc);

    });

  };

但是,当_id与猫鼬期望的“格式”(我想)不匹配时,例如GET /customers/foo返回一个奇怪的错误:


CastError:在路径“ _id”处,对于值“ foo”的转换为ObjectId失败。


那么这是什么错误呢?


查看完整描述

3 回答

?
摇曳的蔷薇

Mongoose的findById方法将id参数转换为模型_id字段的类型,以便它可以正确查询匹配的文档。这是一个ObjectId,但"foo"不是有效的ObjectId,因此强制转换失败。


不会发生这种情况,41224d776a326fb40f000001因为该字符串是有效的ObjectId。


解决此问题的一种方法是在findById调用之前添加检查,以查看是否id为有效的ObjectId,如下所示:


if (id.match(/^[0-9a-fA-F]{24}$/)) {

  // Yes, it's a valid ObjectId, proceed with `findById` call.

}


查看完整回答
反对 回复 2019-09-21
?
慕田峪9158850

使用现有功能检查ObjectID。


var mongoose = require('mongoose');

mongoose.Types.ObjectId.isValid('your id here');


查看完整回答
反对 回复 2019-09-21
?
慕盖茨4494581

if(mongoose.Types.ObjectId.isValid(userId.id)) {

        User.findById(userId.id,function (err, doc) {

            if(err) {

                reject(err);

            } else if(doc) {

                resolve({success:true,data:doc});

            } else {

                reject({success:false,data:"no data exist for this id"})


            }

        });

        } else {

            reject({success:"false",data:"Please provide correct id"});

        }

最好是检查有效性


查看完整回答
反对 回复 2019-09-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信