Express Typescript не использует Middleware - PullRequest
0 голосов
/ 29 марта 2020

Я создал простое промежуточное программное обеспечение для аутентификации, но каким-то образом промежуточное программное обеспечение вообще не вызывается, если, например, я выбрасываю ошибку в своей средней функции, она просто игнорируется, ничего не печатается.

Мне нужно только вызвать промежуточное ПО для аутентификации на маршруте ниже, только для целей тестирования.

My UserRoutes.ts

import auth from '../middleware/auth';

export default class UserRoutes {

  public UserController: UserController = new UserController();

  public routes(app: Application): void {
    // ...
    app.route('/api/users/me')
      .get(this.UserController.me, auth); // this is where I call my auth middleware
}

В своем промежуточном ПО я в основном обрезаю пространство на предъявителя и пытаюсь найти нужного пользователя из токен, который я получаю после входа в систему. Токены правильно сохранены на моем mongodb.

Мое промежуточное программное обеспечение для аутентификации выглядит следующим образом:

const auth = async (req: IUserRequest, res: Response, next: NextFunction) => {
  const token = req.header('Authorization').replace('Bearer ', '');
  const msg = { auth: false, message: 'No token provided.' };

  if (!token) res.status(500).send(msg);

  try {
    const data: any = jwt.verify(token, JWT_KEY);
    const user = await User.findOne({ _id: data._id, 'tokens.token': token });

    if (!user) {
      throw new Error("Could not find User");
    }

    req.user = user;
    req.token = token;
    next();
  } catch (error) {
    res.status(401).send({ error: 'Not authorized to access this resource.' });
  }
}

export default auth;

UserController.ts:

export class UserController {
   ///...
   public me(req: IUserRequest, res: Response) {
     res.send(req.user)
   }
}

1 Ответ

1 голос
/ 29 марта 2020

Итак, ваш метод me является первым вызванным обработчиком, который отправляет ответ и завершает всю обработку. Дальнейшие маршруты не будут называться. Чтобы промежуточное программное обеспечение действительно действовало как промежуточное программное обеспечение и что-то делало, но затем позволяло продолжать вызывать другие маршруты, ему необходимо:

  1. Не отправлять ответ. Технически это могло бы быть, но тогда не было бы никакого смысла для последующих маршрутов, поскольку вы можете отправлять только готовый ответ на запрос.
  2. Вызов next(), который является третьим переданным ему аргументом (который вы не объявили ) когда он завершает свою обработку и хочет продолжить маршрутизацию.

Итак, поскольку me() является первым и завершает всю маршрутизацию, ваш обработчик auth() никогда не вызывается. Возможно, вы хотели поставить обработчик auth() первым? Маршруты выполняются в порядке их регистрации в коде (при условии, что они соответствуют текущему входящему URL).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...