2017-10-10 142 views
1

我使用節點和MongoDB,打造出一支分組和已經運行到一個節點的控制檯錯誤:節點JS - UnhandledPromiseRejectionWarning

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: Cannot read property 'apply' of undefined

我用愛可信發佈到我的節點JS 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);錯誤消失,所以我想這是我的地方出了問題,但不知道如何!

這裏是堆棧跟蹤我在unhandledRejection日誌加入後得到我有人提出:

[] 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(); 
}); 
+0

是的問題是在註冊。阻止等待嘗試趕上看到錯誤 –

+1

可能重複[如何找到哪些承諾是未處理的nodejs UnhandledPromiseRejectionWarning?](https://stackoverflow.com/questions/43834559/how-to-find-which-promises- is-unhandled-in-nodejs-unhandledpromiserejectionwarni) –

回答

2

啓用無極拒絕記錄,所以你可以看到錯誤的行號:

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

這看起來像Express,所以你會在app.js中執行此操作。

偏題:你可能不希望在2017年使用md5進行散列 - 對於有人用相同的散列做兩件事情是相當容易的。

+0

我用控制檯日誌更新了我的問題。看起來謊言錯誤來自promisify圖書館? –

+0

看起來像'note app \ new \ server \ app.js:73:3'上的'app.use'是導致問題的線路。 – mikemaccana

+0

更新了app.js中的第73行 –

0

我猜Team.register未定義,它不能被稱爲一個函數。

當調用promisified register方法時,它沒有對方法的引用。它試圖調用undefined.apply(scope, args),這引發錯誤

TypeError: Cannot read property 'apply' of undefined

通過貓鼬文檔來看,我沒有看到任何地方model.register。檢查the docs的適當方法。