未调用 Passport 身份验证回调

Passport authenticate callback not being called

我在使用 Passport 的 authenticate 方法时遇到了问题。提供给该方法的回调未被调用。

代码如下:

import { Router, Request, Response, NextFunction } from 'express';
import jwt from 'jsonwebtoken';
import passport from 'passport';

// ... some stuff

router.post('/login',
  (req: Request, res: Response, next: NextFunction) => {
    passport.authenticate('local', { session: false }, (err, user, info) => {

      // not reaching this part

      if (err) {
        return next(err);
      }

      if (err || !user) {
        return res.status(400).json({
          message: info ? info.message : 'Login failed',
          user,
        });
      }

      req.login(user, { session: false }, loginErr => {
        if (loginErr) {
          res.send(loginErr);
        }

        const token = jwt.sign(user, secrets.secret);

        return res.json({ user, token });
      });

      return res.status(500).send('Shouldn\'t come here');
    });
  },
  (err: any, req: Request, res: Response, next: NextFunction) => {
    return res.status(err.status || 500).send(err.message)
  });

我错过了我的代码所基于的示例的关键部分。我不得不使用 passport.authenticate 作为 中间件 。因此,我使用 passport.authenticate 生成一个函数,然后将 reqresnext 传递给它,如下所示:

router.post('/login',
  (req: Request, res: Response, next: NextFunction) => {

    // vvv THIS VARIABLE
    const middleware = passport.authenticate('local', { session: false }, (err, user, info) => {
      if (err) {
        return next(err);
      }

      if (err || !user) {
        return res.status(400).json({
          message: info ? info.message : 'Login failed',
          user,
        });
      }

      req.login(user, { session: false }, loginErr => {
        if (loginErr) {
          res.send(loginErr);
        }

        const token = jwt.sign(user, secrets.secret);

        return res.json({ user, token });
      });

      return res.status(500).send('Shouldn\'t come here');
    });

   // vvv AND THIS FUNCTION CALL
    middleware(req, res, next);
  },
  (err: any, req: Request, res: Response, next: NextFunction) => {
    return res.status(err.status || 500).send(err.message)
  });

一切正常。