Node JS - UnhandledPromiseRejectionWarning

时间:2017-10-10 13:38:24

标签: node.js mongodb

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

  

UnhandledPromiseRejectionWarning:未处理的承诺拒绝   (rejection id:2):TypeError:无法读取属性'apply'   未定义

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

控制器:

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
);

我使用了非常相似的功能来创建用户所以我不确定我在哪里出错了,而且我不完全确定错误意味着什么..当我注释掉等待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();
});

2 个答案:

答案 0 :(得分:2)

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

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

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

偏离主题:您可能不希望在2017年使用md5进行散列处理 - 对于某人使用相同的散列制作两件事情非常容易。

答案 1 :(得分:0)

我猜测 Team.register未定义,无法将其作为函数调用。

当调用promisified寄存器方法时,它没有引用该方法。它试图调用undefined.apply(scope, args),这会抛出错误

  

TypeError:无法读取属性&#39; apply&#39;未定义的

通过浏览mongoose文档,我无法在任何地方看到model.register。检查the docs是否有合适的方法。