【发布时间】:2019-10-22 03:47:29
【问题描述】:
我有 API 在路径 /API 上侦听。 (代码暂时在这里https://github.com/vit100/nest-middleware-test。
有中间件(提供静态 swagger 文件)为 root 申请,如下所示:
// app.module.ts------------
import { F1, F2, F3 } from './swaggerMiddleware';
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer): void | MiddlewareConsumer {
consumer.apply(F1, F2, F3).exclude('/api').forRoutes('/');
}
}
// end of app.module.ts------------
//swaggerMiddleware.ts-------------------------
import { Injectable, NestMiddleware, Logger } from '@nestjs/common';
import { Request, Response } from 'express';
import yamljs from 'yamljs';
import swaggerUiExpress from 'swagger-ui-express';
const yamlDoc = yamljs.load(__dirname + '\\swagger.yaml');
@Injectable()
export class F1 implements NestMiddleware {
use(req: Request, res: Response, next: () => void) {
if (req.url.includes('api')) {
return next();
}
req.url = req.originalUrl;
return swaggerUiExpress.serve[0].call(this, req, res, next);
}
}
@Injectable()
export class F2 implements NestMiddleware {
use(req: Request, res: Response, next: () => void) {
if (req.url.includes('api')) {
return next();
}
req.url = req.originalUrl;
return swaggerUiExpress.serve[1].call(this, req, res, next);
}
}
@Injectable()
export class F3 implements NestMiddleware {
use(req: Request, res: Response, next: () => void) {
if (req.url.includes('api')) {
return next();
}
req.url = req.originalUrl;
return swaggerUiExpress.setup(yamlDoc).call(this, req, res, next);
}
}
//end of swaggerMiddleware.ts-------------------------
我没有找到其他集成 swaggerUiExpress 的方法。不幸的是,我必须将调用拆分为单独的中间件类。
类,而不是函数——因为.exclude('/api') 不适用于函数中间件。还必须重新分配req.url = req.originalUrl;,因为它在某处丢失了......
它开始工作了,但我不知道。对我来说,这很鱼腥... 或者应该是另一种服务这种逻辑的方式,比如这个 swagger 中间件?
【问题讨论】:
-
这种官方方式你试过了吗? github.com/scottie1984/swagger-ui-express 你确定你可以在同一个
req,res,next对象上调用两个中间件,即serve、setup?我认为您必须像这样链接app.use('/', swaggerUi.serve, swaggerUi.setup(yamlDoc)); -
是的,我做到了——效果很好。但是我需要提供由另一种方式支持/生成的外部文件,并且该文件在其他应用程序之间共享。这就是我尝试使用这种方式的原因。
-
是的,这看起来很可疑。