Nest.js передает переменную от промежуточного программного обеспечения к контроллеру

avatar
JonasLevin
8 августа 2021 в 20:20
1934
1
3

Я не смог найти понятный способ передачи переменных из промежуточного ПО в структуру в Nest.js. Я проверяю JWT внутри своего AuthMiddleware и хочу сделать этот токен доступным для контроллеров.
Ниже приведен только фрагмент моего промежуточного программного обеспечения для предоставления примера кода. Я хочу сделать token доступным внутри моих контроллеров.

import { Request, Response, NextFunction } from 'express';
// other imports

@Injectable()
export class AuthMiddleware implements NestMiddleware {
  async use(req: Request, res: Response, next: NextFunction) {
    const authHeader = req.header('authorization');

    if (!authHeader) {
      throw new HttpException('No auth token', HttpStatus.UNAUTHORIZED);
    }

    const bearerToken: string[] = authHeader.split(' ');
    const token: string = bearerToken[1];

    res.locals.token = token;
  }
}

Я уже пытался сделать токен доступным, изменив переменную res.locals, но объект ответа все еще пуст в моем контроллере. Это мой контроллер, в котором я хочу получить доступ к токену промежуточного программного обеспечения:

@Controller('did')
export default class DidController {
  constructor(private readonly didService: DidService) {}

  @Get('verify')
  async verifyDid(@Response() res): Promise<string> {
    console.log(res)
    // {}
    return res;
  }
Источник
Micael Levi
8 августа 2021 в 20:34
0

Вы пытались прикрепить req вместо res?

JonasLevin
8 августа 2021 в 20:38
0

Пытался прикрепить к телу, не получилось.

JonasLevin
8 августа 2021 в 20:54
0

Я также не могу прикрепить его только к объекту req, потому что тип Request из экспресса не имеет этого ключа.

Micael Levi
8 августа 2021 в 20:59
0

вы можете, но вам придется написать свой собственный интерфейс/тип, расширяющий тип Request. Кстати, я только что проверил req.locals = 123, и он работал, как и ожидалось. Убедитесь, что ваше промежуточное ПО запущено до метода verifyDid.

JonasLevin
8 августа 2021 в 21:03
0

да работал, когда просто определял req как любой

Ответы (1)

avatar
Akash Gupta
9 августа 2021 в 00:20
3
import { Request, Response, NextFunction } from 'express';
// other imports

@Injectable()
export class AuthMiddleware implements NestMiddleware {
  async use(req: Request, res: Response, next: NextFunction) {
    const authHeader = req.header('authorization');

    if (!authHeader) {
      throw new HttpException('No auth token', HttpStatus.UNAUTHORIZED);
    }

    const bearerToken: string[] = authHeader.split(' ');
    const token: string = bearerToken[1];

    res.locals.token  = token;

    next();  ====> add this to middleware
  }
}

Контроллер

import { Controller, Get, Response } from '@nestjs/common';


@Controller()
export class AppController {
  constructor() {}


  @Get('verify')
  async verifyDid(@Response() res): Promise<string> {
    console.log(res.locals);
    return res;
  }
}

Применение ПО промежуточного слоя

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(AuthMiddleware).forRoutes('*');
  }
}
JonasLevin
9 августа 2021 в 08:35
0

Я все же предпочитаю привязывать токен к req.locals а не к телу, потому что в некоторых запросах я работаю со всем телом и токен внутри тела изменил бы объект из запроса

Akash Gupta
9 августа 2021 в 21:29
0

@JonasLevin я протестировал с местными жителями и добавил обновленный код