我在创建端点以服务于swagger文档时遇到了困难。在本地实现此操作的唯一方法是,如果路径在localhost:3003/dev/swagger//末尾有一个双斜杠;如果省略其中一个正斜杠,它将为路径localhost:3003/swagger返回一个不带/dev的404。一旦部署完毕,API将返回{"message": "Forbidden"},用于任意一个昂首阔步的端点(有或不带//)。如何才能让API端点返回swagger ?我不确定是否遗漏了一些步骤。
下面是我的NestJS应用程序和NestJS应用程序的serverless.yml,下面是一个带有最小设置的回购示例,以复制我的问题。https://github.com/MRdgz/serverless-nestj-swagger
main.ts
// main.ts
import { INestApplication } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { configure as serverlessExpress } from '@vendia/serverless-express';
import { Callback, Context, Handler } from 'aws-lambda';
import { AppModule } from './app.module';
let server: Handler;
function setupSwagger(nestApp: INestApplication): void {
const config = new DocumentBuilder()
.setTitle('Sample API')
.setDescription('Sample API Documentation')
.setVersion('0.0.1')
.addServer('/dev')
.build();
const document = SwaggerModule.createDocument(nestApp, config);
SwaggerModule.setup('/swagger', nestApp, document, {
customSiteTitle: 'Sample',
swaggerOptions: {
docExpansion: 'none',
operationSorter: 'alpha',
tagSorter: 'alpha',
},
});
}
async function bootstrap(): Promise<Handler> {
const app = await NestFactory.create(AppModule);
setupSwagger(app);
await app.init();
const expressApp = app.getHttpAdapter().getInstance();
return serverlessExpress({ app: expressApp });
}
export const handler: Handler = async (
event: any,
context: Context,
callback: Callback,
) => {
event.path = `${event.path}/`;
event.path = event.path.includes('swagger-ui')
? `swagger${event.path}`
: event.path;
server = server ?? (await bootstrap());
return server(event, context, callback);
};severless.yml
service: sample-api
variablesResolutionMode: 20210326
useDotenv: true
plugins:
- serverless-offline
- serverless-plugin-optimize
# functions will inherit settings from provider properties if available,
provider:
name: aws
runtime: nodejs14.x
lambdaHashingVersion: 20201221
# memorySize: 1024 # default 1024 MB
timeout: 30 # default 6 seconds
# sls deploy --stage {stage} otherwise defaults to dev
stage: ${opt:stage, 'dev'}
functions:
main:
handler: dist/main.handler
name: ${opt:stage, 'dev'}-${self:service}
events:
- http:
method: ANY
path: /{proxy+}
cors: true
custom:
serverless-offline:
httpPort: 3003
optimize:
external: ['swagger-ui-dist']发布于 2022-01-27 06:32:39
您可以查看这个GitHub问题,这可能会给您一些想法,这就是我最后的结论:
const document = SwaggerModule.createDocument(app, config);
const forwardedPrefixSwagger = async (
req: any,
_: Response,
next: NextFunction,
) => {
req.originalUrl = (req.headers['x-forwarded-prefix'] || '') + req.url;
next();
};
app.use(
'/api/',
forwardedPrefixSwagger,
swaggerUi.serve,
swaggerUi.setup(document),
);https://stackoverflow.com/questions/70742819
复制相似问题