在Heroku中获得“强制转换为ObjectId”错误,但在LocalHost中没有



我的'lessons/new'页面在我的本地主机上加载良好,但在使用heroku时出现错误。页面将加载,但在heroku后立即崩溃。我为getClassesById添加了一个console.log(foundClass),并且foundClass正确显示。有人能给我指个正确的方向吗?

class.js第27-33行

module.exports.getClassesById = function(id, callback){
    Class.findById(id)
    .populate(
        {path: 'lessons',
        model: 'Lesson', $ne: null}
    ).exec(callback)
}

classes.js

router.get('/:id/lessons/new', function(req, res, next) {
    Class.getClassesById([req.params.id], function(err, foundClass){
        if (err){
            console.log(err)
            throw err
        } else {
            if (req.user && req.user.email == foundClass.instructor_email){
                res.render('lessons/new', {class_id: req.params.id})
            } else {
                res.redirect('/');
            }
        }
    }) 
});

heroku logs

2016-10-24T17:31:08.413872+00:00 app[web.1]: [0mGET /classes/580e0e820a1e5d00118e6159/lessons/new [36m304 [0m30.674 ms - -[0m
2016-10-24T17:31:08.486402+00:00 app[web.1]: [0mGET /stylesheets/bootstrap.min.css [36m304 [0m2.559 ms - -[0m
2016-10-24T17:31:08.486823+00:00 app[web.1]: [0mGET /stylesheets/style.css [36m304 [0m2.326 ms - -[0m
2016-10-24T17:31:08.487513+00:00 app[web.1]: [0mGET /stylesheets/ie10-viewport-bug-workaround.css [36m304 [0m2.315 ms - -[0m
2016-10-24T17:31:08.489252+00:00 app[web.1]: [0mGET /stylesheets/jumbotron.css [36m304 [0m3.708 ms - -[0m
2016-10-24T17:31:08.529026+00:00 app[web.1]: [0mGET /js/bootstrap.min.js [36m304 [0m2.226 ms - -[0m
2016-10-24T17:31:08.530994+00:00 app[web.1]: [0mGET /js/ie10-viewport-bug-workaround.js [36m304 [0m0.699 ms - -[0m
2016-10-24T17:31:09.037191+00:00 app[web.1]: { CastError: Cast to ObjectId failed for value "[ 'favicon.ico' ]" at path "_id"
2016-10-24T17:31:09.037205+00:00 app[web.1]:     at MongooseError.CastError (/app/node_modules/mongoose/lib/error/cast.js:26:11)
2016-10-24T17:31:09.037206+00:00 app[web.1]:     at ObjectId.cast (/app/node_modules/mongoose/lib/schema/objectid.js:147:13)
2016-10-24T17:31:09.037207+00:00 app[web.1]:     at ObjectId.castForQuery (/app/node_modules/mongoose/lib/schema/objectid.js:187:15)
2016-10-24T17:31:09.037208+00:00 app[web.1]:     at cast (/app/node_modules/mongoose/lib/cast.js:225:32)
2016-10-24T17:31:09.037209+00:00 app[web.1]:     at Query.cast (/app/node_modules/mongoose/lib/query.js:2737:10)
2016-10-24T17:31:09.037209+00:00 app[web.1]:     at Query.findOne (/app/node_modules/mongoose/lib/query.js:1350:10)
2016-10-24T17:31:09.037210+00:00 app[web.1]:     at /app/node_modules/mongoose/lib/query.js:2296:21
2016-10-24T17:31:09.037210+00:00 app[web.1]:     at new Promise.ES6 (/app/node_modules/mongoose/lib/promise.js:45:3)
2016-10-24T17:31:09.037211+00:00 app[web.1]:     at Query.exec (/app/node_modules/mongoose/lib/query.js:2290:17)
2016-10-24T17:31:09.037211+00:00 app[web.1]:     at Function.module.exports.getClassesById (/app/models/class.js:32:4)
2016-10-24T17:31:09.037212+00:00 app[web.1]:     at /app/routes/classes.js:105:8
2016-10-24T17:31:09.037213+00:00 app[web.1]:     at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:82:5)
2016-10-24T17:31:09.037213+00:00 app[web.1]:     at next (/app/node_modules/express/lib/router/route.js:110:13)
2016-10-24T17:31:09.037214+00:00 app[web.1]:     at Route.dispatch (/app/node_modules/express/lib/router/route.js:91:3)
2016-10-24T17:31:09.037214+00:00 app[web.1]:     at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:82:5)
2016-10-24T17:31:09.037214+00:00 app[web.1]:     at /app/node_modules/express/lib/router/index.js:267:22
2016-10-24T17:31:09.037215+00:00 app[web.1]:     at param (/app/node_modules/express/lib/router/index.js:340:14)
2016-10-24T17:31:09.037215+00:00 app[web.1]:     at param (/app/node_modules/express/lib/router/index.js:356:14)
2016-10-24T17:31:09.037216+00:00 app[web.1]:     at Function.proto.process_params (/app/node_modules/express/lib/router/index.js:400:3)
2016-10-24T17:31:09.037216+00:00 app[web.1]:     at next (/app/node_modules/express/lib/router/index.js:261:10)
2016-10-24T17:31:09.037216+00:00 app[web.1]:     at Function.proto.handle (/app/node_modules/express/lib/router/index.js:166:3)
2016-10-24T17:31:09.037217+00:00 app[web.1]:     at router (/app/node_modules/express/lib/router/index.js:35:12)
2016-10-24T17:31:09.037217+00:00 app[web.1]:   message: 'Cast to ObjectId failed for value "[ 'favicon.ico' ]" at path "_id"',
2016-10-24T17:31:09.037218+00:00 app[web.1]:   name: 'CastError',
2016-10-24T17:31:09.037218+00:00 app[web.1]:   kind: 'ObjectId',
2016-10-24T17:31:09.037218+00:00 app[web.1]:   value: [ 'favicon.ico' ],
2016-10-24T17:31:09.037219+00:00 app[web.1]:   path: '_id',
2016-10-24T17:31:09.037219+00:00 app[web.1]:   reason: undefined }
2016-10-24T17:31:09.038731+00:00 app[web.1]: 
2016-10-24T17:31:09.038733+00:00 app[web.1]: events.js:160
2016-10-24T17:31:09.038734+00:00 app[web.1]:       throw er; // Unhandled 'error' event
2016-10-24T17:31:09.038734+00:00 app[web.1]:       ^
2016-10-24T17:31:09.038768+00:00 app[web.1]: CastError: Cast to ObjectId failed for value "[ 'favicon.ico' ]" at path "_id"
2016-10-24T17:31:09.038769+00:00 app[web.1]:     at MongooseError.CastError (/app/node_modules/mongoose/lib/error/cast.js:26:11)
2016-10-24T17:31:09.038770+00:00 app[web.1]:     at ObjectId.cast (/app/node_modules/mongoose/lib/schema/objectid.js:147:13)
2016-10-24T17:31:09.038771+00:00 app[web.1]:     at ObjectId.castForQuery (/app/node_modules/mongoose/lib/schema/objectid.js:187:15)
2016-10-24T17:31:09.038771+00:00 app[web.1]:     at cast (/app/node_modules/mongoose/lib/cast.js:225:32)
2016-10-24T17:31:09.038772+00:00 app[web.1]:     at Query.cast (/app/node_modules/mongoose/lib/query.js:2737:10)
2016-10-24T17:31:09.038773+00:00 app[web.1]:     at Query.findOne (/app/node_modules/mongoose/lib/query.js:1350:10)
2016-10-24T17:31:09.038773+00:00 app[web.1]:     at /app/node_modules/mongoose/lib/query.js:2296:21
2016-10-24T17:31:09.038774+00:00 app[web.1]:     at new Promise.ES6 (/app/node_modules/mongoose/lib/promise.js:45:3)
2016-10-24T17:31:09.038774+00:00 app[web.1]:     at Query.exec (/app/node_modules/mongoose/lib/query.js:2290:17)
2016-10-24T17:31:09.038775+00:00 app[web.1]:     at Function.module.exports.getClassesById (/app/models/class.js:32:4)
2016-10-24T17:31:09.038776+00:00 app[web.1]:     at /app/routes/classes.js:105:8
2016-10-24T17:31:09.038776+00:00 app[web.1]:     at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:82:5)
2016-10-24T17:31:09.038777+00:00 app[web.1]:     at next (/app/node_modules/express/lib/router/route.js:110:13)
2016-10-24T17:31:09.038778+00:00 app[web.1]:     at Route.dispatch (/app/node_modules/express/lib/router/route.js:91:3)
2016-10-24T17:31:09.038778+00:00 app[web.1]:     at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:82:5)
2016-10-24T17:31:09.038779+00:00 app[web.1]:     at /app/node_modules/express/lib/router/index.js:267:22
2016-10-24T17:31:09.038779+00:00 app[web.1]:     at param (/app/node_modules/express/lib/router/index.js:340:14)
2016-10-24T17:31:09.038780+00:00 app[web.1]:     at param (/app/node_modules/express/lib/router/index.js:356:14)
2016-10-24T17:31:09.038780+00:00 app[web.1]:     at Function.proto.process_params (/app/node_modules/express/lib/router/index.js:400:3)
2016-10-24T17:31:09.038781+00:00 app[web.1]:     at next (/app/node_modules/express/lib/router/index.js:261:10)
2016-10-24T17:31:09.038781+00:00 app[web.1]:     at Function.proto.handle (/app/node_modules/express/lib/router/index.js:166:3)
2016-10-24T17:31:09.038782+00:00 app[web.1]:     at router (/app/node_modules/express/lib/router/index.js:35:12)
2016-10-24T17:31:09.051877+00:00 app[web.1]: 
2016-10-24T17:31:09.059912+00:00 app[web.1]: npm ERR! Linux 3.13.0-100-generic
2016-10-24T17:31:09.060095+00:00 app[web.1]: npm ERR! argv "/app/.heroku/node/bin/node" "/app/.heroku/node/bin/npm" "start"
2016-10-24T17:31:09.060223+00:00 app[web.1]: npm ERR! node v6.6.0
2016-10-24T17:31:09.060321+00:00 app[web.1]: npm ERR! npm  v3.10.3
2016-10-24T17:31:09.060423+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2016-10-24T17:31:09.060516+00:00 app[web.1]: npm ERR! eTeacher@0.0.1 start: `node ./bin/www`
2016-10-24T17:31:09.060581+00:00 app[web.1]: npm ERR! Exit status 1
2016-10-24T17:31:09.060664+00:00 app[web.1]: npm ERR! 
2016-10-24T17:31:09.060738+00:00 app[web.1]: npm ERR! Failed at the eTeacher@0.0.1 start script 'node ./bin/www'.
2016-10-24T17:31:09.060808+00:00 app[web.1]: npm ERR! Make sure you have the latest version of node.js and npm installed.
2016-10-24T17:31:09.060873+00:00 app[web.1]: npm ERR! If you do, this is most likely a problem with the eTeacher package,
2016-10-24T17:31:09.060940+00:00 app[web.1]: npm ERR! not with npm itself.
2016-10-24T17:31:09.061016+00:00 app[web.1]: npm ERR! Tell the author that this fails on your system:
2016-10-24T17:31:09.061085+00:00 app[web.1]: npm ERR!     node ./bin/www
2016-10-24T17:31:09.061153+00:00 app[web.1]: npm ERR! You can get information on how to open an issue for this project with:
2016-10-24T17:31:09.061212+00:00 app[web.1]: npm ERR!     npm bugs eTeacher
2016-10-24T17:31:09.061280+00:00 app[web.1]: npm ERR! Or if that isn't available, you can get their info via:
2016-10-24T17:31:09.061347+00:00 app[web.1]: npm ERR!     npm owner ls eTeacher
2016-10-24T17:31:09.061415+00:00 app[web.1]: npm ERR! There is likely additional logging output above.
2016-10-24T17:31:09.065020+00:00 app[web.1]: 
2016-10-24T17:31:09.065328+00:00 app[web.1]: npm ERR! Please include the following file with any support request:
2016-10-24T17:31:09.065465+00:00 app[web.1]: npm ERR!     /app/npm-debug.log

类模式

var classSchema = new Schema({
    title: { type: String, required: true },
    description: { type: String, required: true },
    instructor: { type: String, required: true },
    instructor_email: { type: String, required: true },
    //Lessons for the class
    lessons: [
        { type: mongoose.Schema.Types.ObjectId, ref: 'Lesson' }
    ],
    category: { type: mongoose.Schema.Types.ObjectId, ref: 'Category' },
    created : { type : Date, default : Date.now }
});

'classes/show'是它来自的页面classes.js 104 - 114

router.get('/:id', function(req, res, next) {
    Class.getClassesById([req.params.id], function(err, foundClass){
        if (err){
            console.log(err)
            throw err
        } else {
            console.log('Found class.')
            res.render('classes/show', {"class": foundClass})
        }
    });
});

这个错误是因为Mongo ID应该是一个特定的格式。错误日志说它得到了"favicon.ico"作为参数,这违反了Mongo ID格式。

在执行DB操作之前,应该始终验证数据

有一个用于字符串验证和处理的包:https://www.npmjs.com/package/validator

你可以检查参数的格式是否正确:

var validator = require('validator');

then in your route:

if (!validator.isMongoId(req.params.id)) {
    // Param is not mongoId, throw error
}

相关内容

最新更新