节点JS – UnhandledPromiseRejectionWarning

我正在使用Node和MongoDB来创build一个团队分组,并遇到节点控制台错误:

UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:2):TypeError:无法读取undefined属性'apply'undefined

我正在使用Axios发布一个请求到我的NodeJS API,应该在我的MongoDB中创build一个新的条目。 这是我的代码:

控制器:

const mongoose = require('mongoose'); const Team = mongoose.model('Team'); const promisify = require('es6-promisify'); exports.validateTeamName = (req,res,next) => { req.sanitizeBody('teamName'); req.checkBody('teamName','You must supply a name!').notEmpty(); req.sanitizeBody('userId'); req.checkBody('userId','There was an error with your user id - please log out and log back in!').notEmpty(); const errors = req.validationErrors(); if(errors) { req.flash('error',errors.map(err => err.msg)); res.json(req.flash()) return; //if theres errors stop the function from running } next(); }; exports.register = async (req,res,next) => { const team = new Team({ teamName:req.body.teamName, owner:req.body.userId }) const register = promisify(Team.register,Team); await register(team,req.body.password); next() } exports.finishCreateTeam = async (req,res,next) => { console.log('all done') } 

模型:

 const mongoose = require('mongoose'); const Schema = mongoose.Schema; mongoose.Promise = global.Promise; const md5 = require('md5'); const validator = require('validator'); const mongodbErrorHandler = require('mongoose-mongodb-errors'); const passportLocalMongoose = require('passport-local-mongoose'); const teamSchema = new Schema({ teamName:{ type:String, trim:true, required:'Please supply a team name' }, owner:{ type:String, trim:false, required:'Please supply a user ID' } }); teamSchema.plugin(mongodbErrorHandler); module.exports = mongoose.model('Team',teamSchema); 

路线:

 router.post('/createteam', manageTeamController.validateTeamName, manageTeamController.register, manageTeamController.finishCreateTeam ); 

我用非常相似的function来创build用户,所以我不知道我在哪里出错了,再加上我不完全确定错误的意思是什么。当我注释掉等待register(team,req.body.password); 错误消失,所以我想这是我错了,但不知道如何!

以下是我在添加未处理的拒绝日志后得到的堆栈跟踪:

 [💻] Promise { [💻] <rejected> TypeError: Cannot read property 'apply' of undefined [💻] at C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\es6-promisify\dist\promisify.js:75:40 [💻] at Promise (<anonymous>) [💻] at C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\es6-promisify\dist\promisify.js:54:20 [💻] at exports.register (C:\Users\BenLi\Desktop\development projects\note app\new\server\controllers\manageTeamController.js:29:11) [💻] at Layer.handle [as handle_request] (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\layer.js:95:5) [💻] at next (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\route.js:137:13) [💻] at exports.validateTeamName (C:\Users\BenLi\Desktop\development projects\note app\new\server\controllers\manageTeamController.js:18:5) [💻] at Layer.handle [as handle_request] (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\layer.js:95:5) [💻] at next (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\route.js:137:13) [💻] at Route.dispatch (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\route.js:112:3) [💻] at Layer.handle [as handle_request] (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\layer.js:95:5) [💻] at C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\index.js:281:22 [💻] at Function.process_params (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\index.js:335:12) [💻] at next (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\index.js:275:10) [💻] at Function.handle (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\index.js:174:3) [💻] at router (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\index.js:47:12) [💻] at Layer.handle [as handle_request] (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\layer.js:95:5) [💻] at trim_prefix (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\index.js:317:13) [💻] at C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\index.js:284:7 [💻] at Function.process_params (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\index.js:335:12) [💻] at next (C:\Users\BenLi\Desktop\development projects\note app\new\server\node_modules\express\lib\router\index.js:275:10) [💻] at app.use (C:\Users\BenLi\Desktop\development projects\note app\new\server\app.js:73:3) } 

这里是app.js中的第73行:

 app.use((req, res, next) => { req.login = promisify(req.login, req); next(); }); 

启用Promise拒绝日志logging,以便您可以看到错误的行号:

 // Show unhandled rejections process.on('unhandledRejection', function(reason, promise) { console.log(promise); }); 

这看起来像Express,所以你可以在app.js这样做。

偏离主题:你可能不希望在2017年使用md5进行散列 – 对于某人来说,使用相同散列做两件事情是相当容易的。

我猜Team.register是未定义的 ,不能作为一个函数调用。

当被调用的注册方法被调用时,它没有对该方法的引用。 它试图调用undefined.apply(scope, args) ,这会引发错误

TypeError:无法读取未定义的属性'apply'

通过mongoose文档,我没有看到model.register任何地方。 检查文档的适当方法。