node.js - Laste portnummer for Nest.js-applikasjon fra JSON-modul
I min Nest.js-baserte applikasjon prøver jeg å bruke en konfigurasjonsfil for å definere all konfigurasjon for en applikasjon.
Filen configuration.json ser slik ut:
{
"environment": "development",
"backendPort": 8080,
"appRootPath": ".",
...more configuration...
}
Og i min Nest.js-applikasjons main.ts er:
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();
Jeg har aktivert TypeScripts resolveJsonModule-funksjon som nevnt i TypeScript 2.9 Release Notes, og VS Code gjenkjente importen og gir IntelliSense og typekontroll.
Men når jeg prøver å starte appen via
ts-node -r tsconfig-paths/register src/main.ts
Jeg får en feil:
(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.
Finnes det en måte å definere applikasjonsport på en elegant måte, slik jeg prøvde?
Jeg vil ikke at portnummeret skal være hardkodet i main.ts-filen. Jeg vil at det skal kunne konfigureres med en eller annen opsjon slik at jeg kan distribuere den samme applikasjonsbygningen til ulike miljøer hvor det eneste som skiller vil være configuration.json.
Svar #1
Ja. Bruk dette - https://docs.nestjs.com/techniques/configuration del av NestJS-dokumentasjonen for å lage ConfigService. Du kan erstatte dotenv med json hvis du vil. Deretter:
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();
Nå kan du injisere ConfigService i mesteparten av koden din, og mens den lastes kan du validere den ved hjelp av Joi. Håper dette hjelper.
Svar #2
Løsning i 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();
Fortjeneste!
