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を使用すると、コンソールに「認証前」、「認証機能内」、「コールバック認証」の順に表示されるはずですが、最初の2つ、「errortest」、「errortest」の順に表示されます。ブラウザに「」が表示されます。

また、試してみたところreturn done({'message':'test'});、コンソールとブラウザに「[objectObject]」が表示されていました。

これは正しく機能していませんか、それとも何かが足りませんか?

編集:Jared Hansonの応答に従って、このエラーハンドラー関数をapp.get()の3番目の引数として追加すると、エラーをキャッチして適切な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 に答える