我的'课程/新'页面在我的localhost上加载正常,但是在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日志
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})
}
});
});
答案 0 :(得分:0)
它给出了该错误,因为Mongo ID应该是特定格式。错误日志说它有“favicon.ico”作为违反Mongo ID格式的参数。
在进行数据库操作之前,您应该始终验证数据。
有一个用于字符串验证和清理的包:https://www.npmjs.com/package/validator
您可以通过以下方式检查参数格式是否正确:
var validator = require('validator');
然后在你的路线中:
if (!validator.isMongoId(req.params.id)) {
// Param is not mongoId, throw error
}