从JSON模块加载Nest.js应用程序的端口号

时间:2018-06-30 15:01:28

标签: node.js typescript configuration nestjs

在基于Nest.js的应用程序中,我试图使用一个配置文件来定义应用程序的所有配置。

configuration.json 文件如下所示:

{
    "environment": "development",
    "backendPort": 8080,
    "appRootPath": ".",
    ...more configuration...
}

在我的Nest.js应用程序的 main.ts 中是:

import { NestFactory } from "@nestjs/core";
import configuration from "../configuration.json";
import { AppModule } from "./app.module";



async function bootstrap() {
    const app = await NestFactory.create(AppModule);
    await app.listen(configuration.backendPort);
}
bootstrap();

我已启用TypeScript 2.9 Release notes中所述的TypeScript的 resolveJsonModule 功能,并且VS代码成功识别了导入,并提供了IntelliSense和类型检查。

但是当我尝试通过以下方式启动应用程序

ts-node -r tsconfig-paths/register src/main.ts

我得到一个错误:

(node:5236) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'backendPort' of undefined
    at d:\CodeDev\NestCMS\backend\src\main.ts:10:36
    at Generator.next (<anonymous>)
    at fulfilled (d:\CodeDev\NestCMS\backend\src\main.ts:4:58)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:228:7)
    at Function.Module.runMain (module.js:695:11)
    at Object.<anonymous> (d:\CodeDev\NestCMS\backend\node_modules\ts-node\src\_bin.ts:177:12)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
(node:5236) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:5236) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

是否可以像我尝试的那样以优雅的方式定义应用程序端口?

我不希望端口号在main.ts文件中进行硬编码。我希望它可以通过某些选项进行配置,以允许我将同一应用程序构建部署到不同的环境,其中唯一不同的是configuration.json。

4 个答案:

答案 0 :(得分:13)

是的。使用NestJS文档的此https://docs.nestjs.com/techniques/configuration部分来创建ConfigService。您可以根据需要用json替换dotenv。然后:

import {NestFactory} from '@nestjs/core';
import {ConfigService} from 'src/config/config.service';
import {AppModule} from './app.module';

let bootstrap = async () => {
    const app = await NestFactory.create(AppModule);
    const configService: ConfigService = app.get(ConfigService);
    await app.listen(configService.getPort);
};

bootstrap();

现在,您可以在大部分代码中注入ConfigService +加载后,就可以使用Joi对其进行验证。希望这会有所帮助。

答案 1 :(得分:1)

尝试https://www.npmjs.com/package/neconfig以获得优雅的配置NestJs应用。

只需在您的 AppModule 中注册 NeconfigModule

import { Module } from "@nestjs/common";
import { NeconfigModule } from 'neconfig';
import * as path from 'path';

@Module({
  imports: [
    NeconfigModule.register({
      readers: [
        { name: 'env', file: path.resolve(process.cwd(), '.env') },
      ],
    }),
  ],
})
export class AppModule { }

然后像这样使用它:

import { Logger } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { ConfigReader } from 'neconfig';
import { AppModule } from './app.module';

(async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const config = app.get(ConfigReader);
  const port = config.getIntOrThrow('PORT');
  // const port = config.getInt('PORT', 3000);

  await app.listen(port);
  Logger.log(`Listening on http://localhost:${port}`);
})();

答案 2 :(得分:0)

我有一个更好的方法,甚至比此配置服务更简单,因此基本上检查我的仓库:https://github.com/neoteric-eu/nestjs-authsrc/config/index.ts中有一个示例,它是如何工作的,包装为{{1} }很好,但是dotenv更好,因为如果丢失一些值,启动服务器后您将一无所知!因此,基本上,您用于开发的package.json脚本可能类似于:

dotenv-safe

然后使用上面的回购示例和例子!

答案 3 :(得分:0)

2021 年的解决方法:

main.ts, NestJS v8.0.4

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ConfigService } from '@nestjs/config';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const configService: ConfigService = app.get<ConfigService>(ConfigService);
  const port = configService.get('APP_PORT');
  await app.listen(port);
}
bootstrap();

利润!