控制器 Nestjs 中的方法排序错误
Error on ordering of methods in controller Nestjs
我在 Nestjs 中有这个基本的 CRUD 方法。
我面临的问题是,当我在所有方法的顶部应用 getCurrentUserId()
方法时,它工作正常,但是当我在底部应用时,它不起作用并给出错误。
中间件有什么问题吗?
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();
}
}
}
并且我已经像这样将中间件添加到 user.module.ts
export class UsersModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(CurrentUserMiddleware).forRoutes(
'users/current'
);
}
}
路由在到达 @Get('/current')
之前在 @Get('/@:userName')
上匹配,因此它会执行您的 getUserByUsername
方法中的代码。
只需将 getCurrentUserId
移至顶部即可。
路由按照定义的顺序进行评估,第一个匹配的路由用于处理请求。通常,您应该始终将最具体的路由(没有路由参数的路由)放在控制器的顶部以避免此问题。
我在 Nestjs 中有这个基本的 CRUD 方法。
我面临的问题是,当我在所有方法的顶部应用 getCurrentUserId()
方法时,它工作正常,但是当我在底部应用时,它不起作用并给出错误。
中间件有什么问题吗?
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();
}
}
}
并且我已经像这样将中间件添加到 user.module.ts
export class UsersModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(CurrentUserMiddleware).forRoutes(
'users/current'
);
}
}
路由在到达 @Get('/current')
之前在 @Get('/@:userName')
上匹配,因此它会执行您的 getUserByUsername
方法中的代码。
只需将 getCurrentUserId
移至顶部即可。
路由按照定义的顺序进行评估,第一个匹配的路由用于处理请求。通常,您应该始终将最具体的路由(没有路由参数的路由)放在控制器的顶部以避免此问题。