首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >API的NestJS Swagger生成

问API的NestJS Swagger生成
EN

Stack Overflow用户
提问于 2022-01-17 14:17:49
回答 1查看 1.2K关注 0票数 0

我在创建端点以服务于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

代码语言:javascript
复制
// 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

代码语言:javascript
复制
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']
EN

回答 1

Stack Overflow用户

发布于 2022-01-27 06:32:39

您可以查看这个GitHub问题,这可能会给您一些想法,这就是我最后的结论:

代码语言:javascript
复制
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),
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70742819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档