如何在NestJS中安装Express中间件(Express openapi验证程序)?

如何在NestJS中安装Express中间件(Express openapi验证程序)?,express,validation,nestjs,middleware,openapi,Express,Validation,Nestjs,Middleware,Openapi,我正在写申请书。现在我想安装中间件 然而,我不能让它工作。有一个错误,但它总是导致错误 比如说 export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(middleware({apiSpec "./bff-api.yaml"})) .forRoutes(OrganizationC

我正在写申请书。现在我想安装中间件

然而,我不能让它工作。有一个错误,但它总是导致错误

比如说

export class AppModule implements NestModule {
    configure(consumer: MiddlewareConsumer) {
        consumer.apply(middleware({apiSpec "./bff-api.yaml"}))
            .forRoutes(OrganizationController)
    }
}
导致

error TS2345: Argument of type 'OpenApiRequestHandler[]' is not assignable to parameter of type 'Function | Type<any>'.
      Type 'OpenApiRequestHandler[]' is missing the following properties from type 'Type<any>': apply, call, bind, prototype, and 4 more.
错误TS2345:类型为“OpenAPIRestHandler[]”的参数不能分配给类型为“Function | type”的参数。
类型“OpenApiRequestHandler[]”缺少类型“Type”中的以下属性:apply、call、bind、prototype和4个以上。

如何在NestJS中安装此中间件?

我现在已使其正常工作:

configure(consumer: MiddlewareConsumer) {
    middleware({
        apiSpec: `${__dirname}/../api-doc/bff-api.yaml`
    }).forEach(value => consumer.apply(value).forRoutes(OrganizationController))
}
我添加了一个expressopenapi验证器()

AppModule
看起来基本相同,尽管您不需要迭代中间件:

@模块({
导入:[PingModule],
提供程序:[{provide:APP_FILTER,useClass:openapieexceptionfilter}],
})
导出类AppModule实现了NestModule{
配置(消费者:MiddlewareConsumer){
消费者
.申请(
…OpenApiValidator.中间件({
apiSpec:join(uu dirname,'./api.yaml'),
}),
)
。路线(“*”);
}
}
我还添加了一个异常过滤器,将错误从
expressopenapi验证程序
转换为正确的响应;否则我总是会得到一个500的错误。您还可以使用此方法将错误转换为自定义错误格式

从'@nestjs/common'导入{ArgumentsHost,Catch,ExceptionFilter};
从“express”导入{Response};
从“ExpressOpenAPI验证程序”导入{error};
@捕获(…对象值(错误))
导出类OpenApiExceptionFilter实现ExceptionFilter{
捕获(错误:ValidationError,主机:ArgumentsHost){
const ctx=host.switchToHttp();
const response=ctx.getResponse();
response.status(error.status).json(error);
}
}
接口验证错误{
状态:编号;
消息:字符串;
错误:数组;
路径?:字符串;
名称:字符串;
}