路径“_id”处的值“586d62878fc14d30e0ac5379”转换为 ObjectId 失败

Posted

技术标签:

【中文标题】路径“_id”处的值“586d62878fc14d30e0ac5379”转换为 ObjectId 失败【英文标题】:Cast to ObjectId failed for value "586d62878fc14d30e0ac5379" at path "_id" 【发布时间】:2017-05-19 08:12:23 【问题描述】:

我正在使用 node/express/mongo/mongoose 构建一个应用程序。我遇到了一个我似乎无法弄清楚的错误,并且谷歌搜索到目前为止没有任何帮助。

我创建了一个以猫为主题的简单示例来重现我遇到的错误。我基本上是在尝试通过 ObjectId 检索对象。我正在使用创建对象时自动生成的对象 ID(作为字符串)。

当我导航到路径 localhost:3000/kitty/586d62878fc14d30e0ac5379 时,我收到以下错误:'Cast to ObjectId failed for value "586d62878fc14d30e0ac5379" at path "_id" for model "Kitten"'。有问题的代码行是我对 model.Kitten.findById() 的调用 [见下文]。

据我所知,ObjectId 字符串是有效的。

我尝试将我的字符串对象 id 转换为 mongoose 对象 id 并将其传递给 findById 而不是字符串值,但这只会产生一个奇怪的“十六进制不是函数”错误,此外,我在感觉这是不必要的,因为 mongoose 会自动将有效的字符串 id 转换为对象 id。

我正在使用托管的 mongodb 实例 (mlab)。

这是我的参考代码:

Package.json:


  "name": "testapp",
  "version": "0.0.0",
  "private": true,
  "scripts": 
    "start": "node ./bin/www"
  ,
  "dependencies": 
    "body-parser": "~1.15.2",
    "cookie-parser": "~1.4.3",
    "debug": "~2.2.0",
    "express": "~4.14.0",
    "jade": "~1.11.0",
    "mongodb": "^2.2.19",
    "mongoose": "^4.7.6",
    "morgan": "~1.7.0",
    "serve-favicon": "~2.3.0"
  

app.js:

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var index = require('./routes/index');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( extended: false ));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', index);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) 
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
);

// error handler
app.use(function(err, req, res, next) 
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : ;

  // render the error page
  res.status(err.status || 500);
  res.render('error');
);

module.exports = app;

index.js:

var express = require('express');
var router = express.Router();
var model = require('./model');
var mongoose = require('mongoose');

/* GET home page. */
router.get('/kitty/create', function(req, res, next) 

    var fluffy = new model.Kitten( name: 'fluffy' );

    fluffy.save(function(err, fluffy)
        if(err) return next(err);
        res.render('index',  title: 'Express' );
    );

);

router.get('/kitty/:id', function(req, res, next)

    // find kitty by id
    model.Kitten.findById(req.params.id, function(err, kitty)

        if(err) return next(err);

        if(!kitty)
            res.send('no kitty found');
         else 
            res.send(kitty._id);
        

    );

);

module.exports = router;

model.js:

var mongoose = require('mongoose');

mongoose.connect('mongodb://xxxxx:xxxxx@xxxxx.mlab.com:xxxxx/xxxxx');

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() 

    var kittySchema = mongoose.Schema(
        name: String
    );
    var Kitten = mongoose.model('Kitten', kittySchema);

    exports.Kitten = Kitten;

);

您能提供的任何见解将不胜感激。

【问题讨论】:

【参考方案1】:

我遇到了完全相同的问题。 mongoose 版本似乎有问题。我从 4.7.6 降级到 4.7.2(升级前我使用的最后一个版本),没有更多问题了。

我不知道问题是在哪个版本中引入的,但根据谷歌搜索时没有答案,可能是 4.7.6(2017-01-02 发布)。

只是在做

npm install --save mongoose@4.7.2

现在会修复它。

希望这会有所帮助:)

编辑: 这绝对是 4.7.2 之后版本的错误 https://github.com/Automattic/mongoose/issues/4867#issuecomment-270342054

【讨论】:

谢谢。我们刚刚花了将近 2 个工作日来调试同一个问题。恢复到 4.7.1(我们以前的版本)就可以了。

以上是关于路径“_id”处的值“586d62878fc14d30e0ac5379”转换为 ObjectId 失败的主要内容,如果未能解决你的问题,请参考以下文章

CastError:路径“_id”处的值“”转换为 ObjectId 失败

对于模型“Product”的路径“_id”处的值“ascendPrice”,Cast to ObjectId 失败是啥?

CastError:模型的路径“_id”处的值“:id”转换为 ObjectId 失败

模型的路径“_id”处的值“”转换为 ObjectId 失败

模型“Coach”的路径“_id”处的值“”转换为 ObjectId 失败

CastError:模型“Company”的路径“_id”处的值“...”转换为 ObjectId 失败