500错误:对于使用ResourceJS的Mongoose模型,对于path\“_ id \”中的值转换为ObjectId失败

按照这个MEAN应用程序库中logging的一步一步的简单安装resourcejs,当我访问URL http:// localhost:3000 / movie / 584c6f00cf996a9956784807时,出现以下消息:

{“status”:500,“message”:“对于model \”movie \“”,“errors”:{“}”投射到ObjectId对于path\“_ id \”中的值\“584dd2842a056e4a648751b5 \

POST请求也起作用,但PUT和DELETE不起作用。

index.js

var express = require('express'); var bodyParser = require('body-parser'); var mongoose = require('mongoose'); var methodOverride = require('method-override'); var _ = require('lodash'); var app = express(); app.use(bodyParser.urlencoded({extended: true})); app.use(bodyParser.json()); app.use(methodOverride('X-HTTP-Method-Override')); // CORS Support app.use(function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header('Access-Control-Allow-Headers', 'Content-Type'); next(); }); mongoose.connect('mongodb://localhost/meanapp'); mongoose.connection.once('open', function() { // Load the models. app.models = require('./models/index'); var routes = require('./routes'); var numberOfRoutes = 1; _.each(routes, function(controller, route) { app.use(route, controller(app, route)); }); app.listen(3000); }); 

MovieController.js

 var Resource = require('resourcejs'); module.exports = function(app, route) { // Setup the controller for REST; Resource(app, '', route, app.models.movie).rest(); // Return middleware. return function(req, res, next) { next(); }; }; 

电影模型看起来就像这样 ,并以这种方式提供服务 。

我感兴趣的是ResourceJS有以下代码,这似乎不能正确parsing一个ID到MongoDB ObjectID中:

 /** * Register the GET method for this resource. */ get: function(options) { (…) var search = {'_id': req.params[this.name + 'Id']}; (…) } 

什么可能会搞砸了呢?

统计 Windows 10 – 64位操作系统,基于x64的处理器MongoDB v3.2.7,64位NodeJS v4.4.7 Mongoose v4.7.6

因为mongoose需要ObjectId但是您将string传递为_id ,所以您应该对它进行types转换。

尝试这个:

 var mongoose = require('mongoose'); ObjectId = mongoose.Schema.Types.ObjectId; /** * Register the GET method for this resource. */ get: function(options) { (…) var param = req.param[this.name + 'Id']; var search = {'_id': new ObjectId(param)}; (…) } 

如果您需要适用于任何版本的Mongoose和Mongo的通用解决scheme,只需将_id字段定义为string并使用uuid.v4生成唯一值:

 var uuid = require('uuid'); var mongoose = require('mongoose'); // Create the MovieSchema. var MovieSchema = new mongoose.Schema({ _id: { type: String, index: { unique: true }, default: uuid.v4 }, title: { type: String, required: true }, url: { type: String, required: true } }); // Export the model. module.exports = mongoose.model('movie', MovieSchema); 

所以在这种情况下,您的ResourceJS将保持以前的状态并正常工作:

 get: function(options) { (…) var search = {'_id': req.param[this.name + 'Id']}; (…) } 

PS不要忘记安装uuid包:

 npm i --save uuid