【问题标题】:NestJS: How to hide an endpoint in production build?NestJS:如何在生产构建中隐藏端点?
【发布时间】:2023-01-11 18:22:08
【问题描述】:

我想添加一个可以简化开发/测试的端点。同时,生产中不需要这个端点。来自 Java 世界,总是有一个开箱即用的解决方案(例如,使用配置文件),但我没有在 NestJS 文档中找到类似的东西。

问题:有没有办法在 NestJS 中实现一个端点,如果该应用程序是为生产用途构建的,那么该端点将不可用?

【问题讨论】:

    标签: javascript node.js typescript nestjs


    【解决方案1】:

    一些选项取决于您的用例:

    1. 您有基于身份验证或角色的访问控制方案吗?授权? NestJS 有一些 Auth 中间件可能有助于解决这个问题,但如果这是一次性的,可能过于重量级:tutorial

    2. 一种快速而宽松的方法是根据环境变量返回 404。在您的开发服务器中以不同于生产环境的方式设置环境变量。

      if(process.env.ENV_VAR === 'production') {
        throw new HttpException('Not Found', HttpStatus.NOT_FOUND)
      }
      
      
      1. 如果您在 Prod 中或在 Prod 中始终需要大量内部路由,那么执行此操作的一个好方法可能是通过在您的项目中添加第二个服务器并以不同方式代理它来设置私有和公共路由。

    【讨论】:

      【解决方案2】:

      这是一个老问题,但我遇到了类似的问题并像这样解决了它:

      function getControllers(): Array<Type<unknown>> {
        // add all the non-conditional controllers here
        const controllers: Array<Type<unknown>> = []
        if(process.env["NODE_ENV"] !== "production")
          controllers.push(DevController)
        // possible other conditional controllers
        return controllers
      }
      

      现在,当我创建 AppModule 时,我会这样做:

      @Module({
        imports: [/* imports */],
        controllers: getControllers(),
        providers: [/* providers */]
      })
      export class AppModule {}
      

      这样我就可以根据环境配置将条件控制器包含在应用程序中或从应用程序中排除。

      【讨论】:

        猜你喜欢
        • 2020-04-15
        • 1970-01-01
        • 1970-01-01
        • 2012-03-01
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-02
        相关资源
        最近更新 更多