到目前为止我找到的唯一解决方案来自此评论https://github.com/nestjs/nest/issues/528#issuecomment-497020970 https://github.com/nestjs/nest/issues/528#issuecomment-497020970
context.interceptor.ts
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common'
import { Observable } from 'rxjs'
/**
* Injects request data into the context, so that the ValidationPipe can use it.
*/
@Injectable()
export class ContextInterceptor implements NestInterceptor {
intercept(
context: ExecutionContext,
next: CallHandler
): Observable<any> {
const request = context.switchToHttp().getRequest();
request.body.context = {
params: request.params,
query: request.query,
user: request.user,
};
return next.handle()
}
}
main.ts
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalInterceptors(new ContextInterceptor());
// ...
}
如果你使用{whitelist: true}
in ValidationPipe
您需要允许的参数context
在您的 Dto 对象中。
这可以通过扩展这样的 Dto 来完成:
context-aware.dto.ts
import { Allow } from 'class-validator';
export class ContextAwareDto {
@Allow()
context?: {
params: any,
query: any,
user: any,
}
}
之后,您将能够在自定义验证器中验证正文时访问请求数据validationArguments.object.context
您可以轻松调整上述内容以在验证参数或查询时访问上下文,尽管我发现仅在正文验证期间使用此内容就足够了。