node.js - 未调用Nodejs Passport身份验证回调

标签 node.js passport.js

使用 Nodejs Passport,我正在使用以下代码测试发生错误情况时会发生什么:

passport.use(new LocalStrategy(
  function(username, password, done) {
    // asynchronous verification, for effect...
    process.nextTick(function () {
      findByUsername(username, function(err, user) {
    console.log('in auth function');
      return done('errortest');
        if (err) { return done(err); }
        if (!user) {
          return done(null, false, { message: 'Unknown user ' + username });
        }
        if (user.password != password) {
          return done(null, false, { message: 'Invalid password' });
        }
        return done(null, user);
      })
    });
  }
));

app.get('/logintest', function(req, res, next) {
console.log('before authenticate');
  passport.authenticate('local', function(err, user, info) {
console.log('authenticate callback');
    if (err) { return res.send({'status':'err','message':err.message}); }
    if (!user) { return res.send({'status':'fail','message':info.message}); }
    req.logIn(user, function(err) {
      if (err) { return res.send({'status':'err','message':err.message}); }
      return res.send({'status':'ok'});
    });
  })(req, res, next);
});

使用/logintest?username=bob&password=s 我希望在控制台中看到的路由,“验证前”然后“在验证函数中”然后“验证回调”,但它只显示前两个后跟“错误测试”,并在浏览器中显示“errortest”。

我也试过 return done({'message':'test'}); 并且在控制台和浏览器中都显示了“[object Object]”。

这是无法正常工作还是我遗漏了什么?

编辑:根据 Jared Hanson 的回复,将此错误处理函数添加为 app.get() 的第三个参数允许我捕获错误并返回适当的 json:

...
    })(req, res, next);
  },
  function(err, req, res, next) {
    // failure in login test route
    return res.send({'status':'err','message':err.message});
  });

最佳答案

您完全理解它,并且它按预期工作。

如果发生任何错误,Passport 会立即 next() 出现该错误。如果您想以自定义方式处理该错误,您可以使用错误处理中间件(详情:http://expressjs.com/guide/error-handling.html)。

自定义回调主要用于处理身份验证成功或失败(user == false)。错误,如 DB 连接等,不会传递回回调,有利于上述错误处理中间件。我考虑过改变这一点,但还没有找到令人信服的理由。但是,如果您有上述未涵盖的用例,请告诉我。

关于node.js - 未调用Nodejs Passport身份验证回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12217881/

相关文章:

javascript - Passport JS :redirect to another url with data

node.js - 为什么sequelize返回500 [object SequelizeInstance :Users] when connecting to express session?

reactjs - 使用Passport + Facebook + Express + create-react-app + React-Router +代理进行身份验证

node.js - 结合 Typescript Koa-Router 和 Passport

javascript - 注册 Passport 本地注册例程时出错

node.js - Socket.io 命名空间限制以及如何扩展它

javascript - 2018 年如何在 AWS Lambda 中访问 header

javascript - node.js 请求对象-返回响应体以供进一步操作

node.js - apt-get install nodejs-legacy npm 无法识别

node.js createWriteStream 不会在 Heroku 上创建新文件