Javascript Node.js未处理的承诺拒绝

Javascript Node.js未处理的承诺拒绝,javascript,node.js,passport.js,q,Javascript,Node.js,Passport.js,Q,我试图使用passport登录node.js,但是当数据库中没有的用户名尝试登录时,我遇到了一个问题。我收到以下错误(节点:9708)未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:1):TypeError:deferred.resolve不是函数 登录功能: exports.login = function(username, password) { var deferred = Q.defer; MongoClient.connect(mon

我试图使用
passport
登录node.js,但是当数据库中没有的用户名尝试登录时,我遇到了一个问题。我收到以下错误
(节点:9708)未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:1):TypeError:deferred.resolve不是函数

登录功能:

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('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);
    });
}));
Passport.use函数:

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('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);
    });
}));

承诺可以解决,也可以拒绝。您必须为这两种情况编写程序。在代码末尾添加.catch,如下所示:

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

它似乎在抱怨
延迟。解决
在登录函数的第一个
if
语句中不是函数。我理解这一点,但问题是如何修复“未处理的承诺拒绝”“。当他发现错误并分享时,我们可以对问题有更详细的了解。然后您需要创建该函数。”。如果我的问题解决了未经处理的承诺,那么请打勾并投赞成票。