2017-07-08 140 views
2

我試圖使用passport進行node.js登錄,但是當數據庫中沒有的用戶名試圖登錄時,我遇到問題。我收到以下錯誤(node:9708) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: deferred.resolve is not a functionNode.js未處理的承諾拒絕

登錄功能:

exports.login = function(username, password) { 
    var deferred = Q.defer; 

    MongoClient.connect(mongodbUrl, function(err, db) { 
     var collection = db.collection('users'); 

     collection.findOne({'username' : username}).then(function(result) { 
      if (result === null) { 
       console.log('User not found:', username); 
       deferred.resolve(false); 
      } else { 
       var hash = result.password; 
       console.log('User found:', username); 

       if (bcrypt.compareSync(password, hash)) { 
        deferred.resolve(result); 
       } else { 
        console.log('Authentication for ' + username + 'failed'); 
        deferred.resolve(false); 
       } 
      } 

      db.close(); 
     }); 
    }).catch(err => console.log(err)); 

    return deferred.promise; 
}; 

Passport.use功能:

passport.use('local-signin', new LocalStrategy({passReqToCallback : true}, function(req, username, password, done) { 
    funct.login(username, password).then(function(user) { 
     if (user) { 
      console.log(user.username + 'logged in'); 
      req.session.success = 'Welcome, ' + user.username + '!'; 
      done(null, user); 
     } 

     if (!user) { 
      console.log('Failed login attempt'); 
      req.session.error = 'Your Password or Username is incorrect! Please try again.'; 
      done(null, user); 
     } 
    }).fail(function(err) { 
     console.log(err.body); 
    }); 
})); 

回答

2

承諾可以解決或拒絕。你必須爲兩種情況編程。將代碼添加到代碼末尾,如下所示:

collection.findOne({'username' : username}).then().catch(err => console.log(err)) 
+0

似乎在抱怨'deferred.resolve'不是第一個'if'語句在登錄函數中的函數。 – Nhabbott

+0

我明白了,但問題是如何解決'未處理的承諾拒絕'。當他捕捉到錯誤並分享它時,我們可以有一個更詳細的瞭解問題 – Blaze349

+0

然後你需要創建該功能。未處理的承諾,然後請給它一個打勾和upvote。 – Blaze349

相關問題