Passport JS自定义回调调用了3次

时间:2017-06-20 08:52:53

标签: javascript node.js express passport.js

我正在使用护照js构建快递js api,并且为了能够使用custom callbacks返回格式为json的自定义错误消息。

当我提供未知电子邮件时,我写的自定义回调被调用3次,结果为var arrayString=Array<String?>(5){null} var nullArray= arrayOfNulls<String>(5) 。这是有道理的。

感谢任何帮助。

这是我的实施:

策略:

Unhandled rejection Error: Can't set headers after they are sent.

使用自定义回调进行身份验证的Express中间件:

const localLoginStrategy = new LocalStrategy({
    usernameField: "emailAddress"
}, (emailAddress, password, done) => {
    // Called once
    User.findOne({
        where: { emailAddress }
    }).then((existingUser) => {
        // Called once
        if (!existingUser) { return done(null, false, { message: "Invalid email/password combination", status: 401 }); }

        return existingUser.comparePassword(password);
    }).then((userData) => {
        return done(null, userData);
    }).catch((err) => {
        return done(null, false, { message: "Invalid email/password combination", status: 401 });
    });
});

passport.use(localLoginStrategy);

2 个答案:

答案 0 :(得分:1)

您多次调用done函数。

我相信当您使用return done(...)方法拨打then时,下一个then会再次致电done

这就是为什么来自callback的{​​{1}}函数被更多地按时调用的原因。

希望它有所帮助。

答案 1 :(得分:1)

要检查强制请求正文字段,请创建一个通用中间件,该中间件将检查必填字段并返回相应的返回代码。就像下面一样。

module.exports = function checkParams(params) {
  params = params || [];
  return function(req, res, next) {
    var valid = true;
    if(Array.isArray(params)) {
      params.forEach(function(_param) {
        valid = valid && !!req.body[_param];
      });
    }
    if (valid) { next() } else {return res.status(400).end();} //this is for missing required parameters
  };
};

现在让我们假设你有两个API。登录和CreateUser。 API路线应如下所示

app.post('/Login', checkParams(['emailAddress', 'password']), passport.authenticate('local', { failureRedirect: '/login' }), actualLoginMethod);


app.post('/CreateUser', checkParams(['userName', 'Phone']), passport.authenticate('local', { failureRedirect: '/login' }), actualCreateUserMethod); 

如果缺少这些参数中的任何一个(/ CreateUser中的userName和Phone,以及/ Login中的电子邮件地址和密码),那么它将返回400状态并从该点停止执行,您可以根据需要更改checkParams的逻辑。 / p>

如果需要参数,那么它将检查JWT本地策略。一旦请求到达两个检查点,它就会调用实际方法。

希望这对你有所帮助。