从 JSON 模块加载 Nest.js 应用程序的端口号
Loading of port number for Nest.js application from JSON module
在我基于 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 的 resolveJsonModule 功能,如 TypeScript 2.9 Release notes 中所述,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.
是的。使用 NestJS 文档的 https://docs.nestjs.com/techniques/configuration 部分来创建 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 验证它。希望这有帮助。
我有更好的方法来做到这一点,甚至比这个配置服务更简单,所以基本上检查我的 repo: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"
然后使用上面的 repo 示例,问候!
尝试 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}`);
})();
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();
盈利!
在我基于 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 的 resolveJsonModule 功能,如 TypeScript 2.9 Release notes 中所述,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.
是的。使用 NestJS 文档的 https://docs.nestjs.com/techniques/configuration 部分来创建 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 验证它。希望这有帮助。
我有更好的方法来做到这一点,甚至比这个配置服务更简单,所以基本上检查我的 repo: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"
然后使用上面的 repo 示例,问候!
尝试 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}`);
})();
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();
盈利!