NodeJS - 回调错误

时间:2014-02-12 13:25:12

标签: node.js bcrypt passport.js compoundjs

我正在尝试使用Compoundjs,Passportjs(复合护照)和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);
};

我的代码中的错误在哪里?

1 个答案:

答案 0 :(得分:0)

您可能需要为上次调用done()添加一条else语句,如下所示:

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(错误,false)...然后最终在verifyPassword时调用done() )调用你给它的回调。

对done()的第二次调用可能是生成标题已设置错误。