Загрузка номера порта для приложения Nest.js из модуля JSON - PullRequest
0 голосов
/ 30 июня 2018

В моем приложении на основе 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();

Я включил функцию resolJsonModule в TypeScript, как упомянуто в Замечания к выпуску TypeScript 2.9 и код 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.

Ответы [ 3 ]

0 голосов
/ 08 июля 2018

У меня есть даже лучший подход для этого, и он даже проще, чем эта служба конфигурации, поэтому в основном проверь мое репо: https://github.com/neoteric-eu/nestjs-auth В src/config/index.ts есть пример того, как это работает, пакет dotenv довольно хорошо, но dotenv-safe намного лучше, потому что если вы пропустите некоторые значения, вы не узнаете об этом после запуска сервера! Так что в основном ваш скрипт package.json для разработки может выглядеть так:

"develop": "node $NODE_DEBUG_OPTION -r ts-node/register -r dotenv-safe/config src/index.ts"

, а затем использовать и пример репо сверху, с уважением!

0 голосов
/ 02 августа 2019

Попробуйте https://www.npmjs.com/package/neconfig для элегантной конфигурации приложения NestJs.

Просто зарегистрируйтесь NeconfigModule в вашем AppModule :

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}`);
})();
0 голосов
/ 30 июня 2018

Да. Используйте эту - https://docs.nestjs.com/techniques/configuration часть документов NestJS для создания ConfigService. Вы можете заменить dotenv на json, если хотите. Тогда:

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. Надеюсь, это поможет.

...