如何修复NestJS中调用API时出现的400 Bad Request错误
解决NestJS接口返回400 Bad Request的问题
针对你提供的代码,400错误大概率是请求参数验证失败导致的,以下是具体排查和解决方法:
1. 检查请求参数是否正确传递
你的接口要求organisationId作为Query参数,且必须是整数。如果请求时:
- 没有携带
organisationId参数 - 参数值不是有效整数(比如字符串、小数、空值)
都会触发ParseIntPipe的验证失败,返回400错误。
解决方式:
确保请求URL格式正确,例如:
GET /reviews-with-answers?organisationId=123
其中123是有效的整数值。
2. 处理参数可选的场景(如果需要)
如果允许organisationId可选,需要添加@Optional()装饰器,并在代码中处理参数为空的情况:
import { Optional, BadRequestException } from '@nestjs/common'; @Roles(Role.Supplier) @Get("reviews-with-answers") async getAllReviewsWithAnswers( @Optional() @Query("organisationId", ParseIntPipe) organisationId?: number, ) { if (!organisationId) { throw new BadRequestException('必须提供有效的organisationId整数参数'); } return this.reviewService.getAllReviewsWithAnswers(organisationId); }
3. 自定义参数验证错误信息
默认的ParseIntPipe错误信息不够明确,可以自定义异常提示,方便排查问题:
import { ParseIntPipe, HttpStatus, BadRequestException } from '@nestjs/common'; @Roles(Role.Supplier) @Get("reviews-with-answers") async getAllReviewsWithAnswers( @Query("organisationId", new ParseIntPipe({ exceptionFactory: (error) => new BadRequestException(`参数organisationId格式错误: ${error}`), errorHttpStatusCode: HttpStatus.BAD_REQUEST, })) organisationId: number, ) { return this.reviewService.getAllReviewsWithAnswers(organisationId); }
4. 排查权限守卫的潜在问题
虽然400错误通常和参数相关,但如果@Roles装饰器的守卫实现存在逻辑错误(比如错误解析权限信息导致请求被判定为无效),也可能返回400。可以临时注释@Roles(Role.Supplier)装饰器,测试接口是否正常响应,以此排除权限守卫的问题。
内容的提问来源于stack exchange,提问作者Muhammad Deo
相关产品推荐
相关产品推荐

