express - 如何在 NestJS 中安装 Express 中间件(express-openapi-validator)?
问题描述
我正在编写一个NestJS应用程序。现在我想安装Express中间件express-openapi-validator。
但是,我无法让它工作。express中有关于如何安装 express-openapi-validator 的描述,但总是会导致错误。
例如
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.
如何在 NestJS 中安装这个中间件?
解决方案
我在 express-openapi-validator 中添加了一个NestJS 示例(后代的静态链接)。
看起来基本相同,AppModule
尽管您不需要遍历中间件:
@Module({
imports: [PingModule],
providers: [{ provide: APP_FILTER, useClass: OpenApiExceptionFilter }],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(
...OpenApiValidator.middleware({
apiSpec: join(__dirname, './api.yaml'),
}),
)
.forRoutes('*');
}
}
我还添加了一个异常过滤器来将错误转换express-openapi-validator
为正确的响应;否则我总是会收到 500 错误。您还可以使用这种方法将错误转换为自定义错误格式。
import { ArgumentsHost, Catch, ExceptionFilter } from '@nestjs/common';
import { Response } from 'express';
import { error } from 'express-openapi-validator';
@Catch(...Object.values(error))
export class OpenApiExceptionFilter implements ExceptionFilter {
catch(error: ValidationError, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
response.status(error.status).json(error);
}
}
interface ValidationError {
status: number;
message: string;
errors: Array<{
path: string;
message: string;
error_code?: string;
}>;
path?: string;
name: string;
}
推荐阅读
- python - 参考高级目录
- c++ - 如何在openmp中使用并行化两个独立的for循环?
- javascript - 检查字符串中连续的两个整数
- php - 多个有界上下文中的实体标识符
- entity-framework - 使用 EF Core 的类似 Dapper 的多查询
- reactjs - 更改 material-ui 开关 onChange 的检查状态
- excel - 简单 IF 语句的公式错误
- python - 另一个没有名为 *** 的模块,带有 pytest
- android - 已经为您的设备安装了最佳驱动程序:安装 Android 设备 USB 驱动程序
- r - R:将自定义图例添加到 ggplot