我正在使用node / express / mongo / mongoose构建应用。我遇到了一个错误,我似乎无法弄清楚,谷歌搜索到目前为止没有帮助。
我创建了一个简单的,以猫为主题的示例来重新创建我遇到的错误。我基本上试图通过ObjectId检索一个对象。我正在使用在创建对象时自动生成的对象id(作为字符串)。
当我导航到路径localhost:3000 / kitty / 586d62878fc14d30e0ac5379时,我收到以下错误:'对于模型“Kitten”,路径为“_id”的值为“586d62878fc14d30e0ac5379”的“转换为ObjectId失败”。令人讨厌的代码行是我对model.Kitten.findById()的调用[见下文]。
据我所知,ObjectId字符串有效。
我已经尝试将我的字符串对象id转换为mongoose对象id并将其传递给findById而不是字符串值,但这只会产生一个奇怪的“hex is not a function”错误,而且,我在这是不必要的,因为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;
});
非常感谢您提供的任何见解。
答案 0 :(得分:6)
我遇到了完全相同的问题。 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