是否可以为服务函数使用验证管道?我想检查我的数据在一个函数中创建一个类中的对象,但它似乎没有效果:
@UsePipes(new ValidationPipe())
async create(createMemberDto: CreateMemberDto, temp: boolean=false) {
// Do something
}
对于我的控制器中的端点,管道工作得很好,但对于服务中的这个函数则不行(如果缺少一个值,则不会抛出异常)。
我该如何处理,或者有其他选择吗?
不,不可能。这个@UsePipes()
设置了Nest稍后读取的元数据。当Nest启动时,它将每个路由设置为底层HTTP适配器的中间件。在这个中间件中,Nest检查所有可能的元数据(方法类型、路由名称、使用管道、使用保护、使用拦截器和使用过滤器),然后检查路由处理程序参数的元数据(req、body、param、query等),基本上做一些类似这样的事情(大量伪代码进来,实际代码更干净,写得更好)
const foundClasses = await this.discoveryService.findClassesWithMetadata(ControllerMetadata);
for (const found of foundClasses) {
const routes = await this.discoveryService.findMethodsOfClassWithMetadata(RouteHandlerMetadata, found);
for (const route of routes) {
const usePipes = this.reflector.get(PipesMetadata, found, route);
const useGuards = this.reflector.get(GuardMetadata, found, route);
const useInterceptors = this.reflector.get(InterceptorMetadata, found, route);
const useFilters = this.reflector.get(FilterMetadata, found, route);
if (useGuards) {
callGuardsToCheck(useGaurds.guards);
}
if (useInterceptors) {
callInterceptors(useInterceptors.interceptors);
}
if (usePipes) {
callPipes(usePipes.pipes);
}
if (useFilters) {
bindFilters(useFilters.filters);
}
this.httpAdapter[route.method ?? 'use'](`${found.route}/${route.route}`, (req, res, next) => next(found[route.name](metadataFromParameters(req)));
}
}
我保证,这比代码库中的任何东西都要混乱和肮脏。
但是它说明,一旦控制器的路由处理程序方法被调用(found[route.name]()
),那么请求就脱离了Nest的控制,直到控制器返回回来,所以它不能将管道绑定到服务。
说了这么多,可以从class-transformer
导入transform
,从class-validator
导入validate
,然后自己运行验证。管道除了管理对这些的调用并跳过对原语