Tengo estos métodos CRUD básicos en Nestjs. El problema al que me enfrento es que cuando aplico el método getCurrentUserId() en la parte superior de todos los métodos, funciona bien, pero cuando lo aplico en la parte inferior, no funciona y da error. ¿Hay algo malo con el middleware?
user.controller.ts
@Controller('users') @Serialize(UserDto) export class UsersController { constructor(private usersService: UsersService) {} @Post('/signup') create(@Body() createUserDto: CreateUserDto): Promise<User> { return this.usersService.create(createUserDto); } @Get('/@:userName') async getUserByUsername(@Param('userName') userName: string) { const user = await this.usersService.findByName(userName); console.log(userName); if (!user) { throw new NotFoundException('User Not Found'); } return user; } //! Testing for current user @Get('/current') @UseGuards(JwtAuthGuard) async getCurrentUserId(@CurrentUser() id: string) { console.log('running endpoint'); return id; } } current-user.decorator.ts
import { createParamDecorator, ExecutionContext } from '@nestjs/common'; export const CurrentUser = createParamDecorator( (data : unknown , context : ExecutionContext) => { const req = context.switchToHttp().getRequest(); console.log("I am running") return req.id; } ) current-user.middleware.ts
@Injectable() export class CurrentUserMiddleware implements NestMiddleware { constructor(private usersService: UsersService) {} async use(req: RequestId, res: Response, next: NextFunction) { const token = req.headers['authorization']; console.log(token); if (!token) { throw new UnauthorizedException('Unauthorized'); } try { const { userId } = await this.usersService.getUserByToken(token); req.id = userId; console.log(req.id) next(); } catch { throw new UnauthorizedException(); } } } Y he agregado el middleware a user.module.ts así
export class UsersModule { configure(consumer: MiddlewareConsumer) { consumer.apply(CurrentUserMiddleware).forRoutes( 'users/current' ); } }La ruta coincide con @Get('/@:userName') antes de que llegue a @Get('/current') por lo que está ejecutando el código dentro de su método getUserByUsername en su lugar.
Simplemente mueva getCurrentUserId a la parte superior y debería estar bien.
Las rutas se evalúan en el orden en que se definen y la primera coincidencia se usa para manejar la solicitud. En general, siempre debe colocar las rutas más específicas (las que no tienen parámetros de ruta) en la parte superior de su controlador para evitar este problema.