【问题标题】:NodeJS - error with callbacksNodeJS - 回调错误
【发布时间】:2014-02-12 13:25:12
【问题描述】:

我正在尝试使用 Compoundjs、Passportjs (compound-passport) 和 Bcryptjs 实现本地身份验证。 这是我的代码:

定义新战略

var Strategy = require('passport-local').Strategy;
passport.use(new Strategy({
    usernameField: conf.usernameField || 'email'
}, exports.callback));

回调函数

exports.callback = function (email, password, done) { 
    exports.User.findOrCreate({
        email: email,
        password: password
    }, function (err, user) {
        if (err) {
            return done(err);
        }
        if (!user) {
            return done(err, false);
        }
        var len = exports.User.verifyPassword.length;
        if (len === 2) {
            if (!exports.User.verifyPassword(password, user.password)) {
                return done(err, false);
            } else {
                return done(err, user);
            }
        } else if (len === 3) {
            exports.User.verifyPassword(password, user.password, function(err, isMatch) {
                return done(err, !err && isMatch ? user : false);
            });
        }
        return done(err, false);
    });
};

User.verifyPassword

User.verifyPassword = function verifyPassword(password, hash, cb) {
    bcrypt.compare(password, hash, function(err, isMatch) {
        if(err) return cb(err);
        return cb(null, isMatch);
    });
};

在这种情况下,我收到以下错误:

错误:发送后无法设置标头。

指登录成功后的重定向。 如果我使用没有回调的 verifyPassword(同步模式)它工作正常:

User.verifyPassword = function verifyPassword(password, hash) {
    return bcrypt.compareSync(password, hash);
};

我的代码哪里出错了?

【问题讨论】:

    标签: node.js bcrypt passport.js compoundjs


    【解决方案1】:

    您可能需要为最后一次调用 done() 添加一条 else 语句,如本 sn-p 所示:

    if (len === 2) {
        if (!exports.User.verifyPassword(password, user.password)) {
            return done(err, false);
        } else {
            return done(err, user);
        }
    } else if (len === 3) {
        exports.User.verifyPassword(password, user.password, function(err, isMatch) {
            return done(err, !err && isMatch ? user : false);
        });
    }
    else {
        // Added an ELSE statement here
        return done(err, false);
    }
    

    如果没有这个 else 语句,将调用 exports.User.verifyPassword() 并调用 return done(err,false)...然后最终在 verifyPassword( ) 调用你给它的回调。

    对 done() 的第二次调用可能会产生标头已设置错误。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 2020-05-28
    相关资源
    最近更新 更多