22

使用 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”和“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});
  });
4

3 回答 3

18

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

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

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

于 2012-08-31T15:23:24.267 回答
7

bodyparser.json()引起了我的问题,我通过按路线(特别是在护照路线上)设置它来修复它,如下所示:

app.post('/login', bodyParser.urlencoded({ extended: true }), function (req, res, next) {
          passport.authenticate('local', function (err, user, info) {
               if (err) { return next(err) }
               if (!user) {
                    console.log('bad');
                    req.session.messages = [info.message];
                    return res.redirect('/login')
               }
               req.logIn(user, function (err) {
                    console.log('good');
                    if (err) { return next(err); }
                    return res.redirect('/');
               });
          })(req, res, next);
     });
于 2014-12-19T06:05:59.337 回答
2

我有同样的问题。然后放,

const bodyParser=require('body-parser');
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());
于 2018-04-06T06:29:08.017 回答