如何区分开发环境和线上环境及其配置(NestJS + MySQL + TypeScript)

在上一篇https://jasonzk.com/nestjs/nesttsmysql/文章中,我们详细介绍了如何搭建开发NestJS+MySQL+TypeScript环境。本文将在此基础上,详细介绍如何区分开发环境和线上环境,不同配置的加载以及如何使用PM2在生产环境中部署NestJS项目。

使用环境变量区分环境

首先,我们需要在项目根目录下创建两个环境变量文件:.env.development.env.production,分别用于开发环境和生产环境,并安装dotenv。

.env.development

Terminal window
1
NODE_ENV=development
2
DB_HOST=localhost
3
DB_PORT=3306
4
DB_USERNAME=root
5
DB_PASSWORD=password
6
DB_DATABASE=test

.env.production

Terminal window
1
NODE_ENV=production
2
DB_HOST=your-production-host
3
DB_PORT=3306
4
DB_USERNAME=your-production-username
5
DB_PASSWORD=your-production-password
6
DB_DATABASE=your-production-database

install dotenv

Terminal window
1
npm install dotenv

src目录下创建一个config目录,并在其中创建一个configuration.ts文件,用于加载环境变量:

1
import * as dotenv from "dotenv";
2
3
const env = process.env.NODE_ENV || "development";
4
5
dotenv.config({ path: `.env.${env}` });
6
7
export default () => ({
8
environment: env,
9
database: {
10
host: process.env.DB_HOST,
11
port: parseInt(process.env.DB_PORT, 10) || 3306,
12
username: process.env.DB_USERNAME,
13
password: process.env.DB_PASSWORD,
14
database: process.env.DB_DATABASE,
15
},
16
});

配置不同的数据库连接

接下来,在src/app.module.ts中,使用ConfigModuleTypeOrmModule加载数据库配置:

1
import { Module } from "@nestjs/common";
2
import { ConfigModule, ConfigService } from "@nestjs/config";
3
import { TypeOrmModule } from "@nestjs/typeorm";
4
import configuration from "./config/configuration";
5
import { UsersModule } from "./users/users.module";
6
import { User } from "./users/user.entity";
7
import { AppController } from "./app.controller";
8
import { AppService } from "./app.service";
9
10
@Module({
11
imports: [
12
ConfigModule.forRoot({
13
isGlobal: true,
14
load: [configuration],
15
}),
16
TypeOrmModule.forRootAsync({
17
imports: [ConfigModule],
18
useFactory: (configService: ConfigService) => ({
19
type: "mysql",
20
host: configService.get("database.host"),
21
port: configService.get("database.port"),
22
username: configService.get("database.username"),
23
password: configService.get("database.password"),
24
database: configService.get("database.database"),
25
entities: [User],
26
synchronize: true,
27
}),
28
inject: [ConfigService],
29
}),
30
UsersModule,
31
],
32
controllers: [AppController],
33
providers: [AppService],
34
})
35
export class AppModule {}

加载不同的配置文件

为了确保配置文件的加载,ConfigModuleforRoot方法需要正确设置isGlobalload选项,TypeOrmModuleforRootAsync方法用于异步加载配置,并使用ConfigService获取数据库连接信息。

在开发环境中启动项目

在开发环境中,使用Nest CLI的start命令启动项目:

Terminal window
1
npm run start

在生产环境中部署项目

在生产环境中,我们推荐使用PM2来管理和运行NestJS项目。

安装PM2

首先,全局安装PM2:

Terminal window
1
npm install -g pm2

配置PM2

在项目根目录下创建一个ecosystem.config.js文件,配置PM2:

1
module.exports = {
2
apps: [
3
{
4
name: "my-nestjs-project",
5
script: "dist/main.js",
6
env: {
7
NODE_ENV: "development",
8
},
9
env_production: {
10
NODE_ENV: "production",
11
},
12
},
13
],
14
};

构建项目

在启动项目之前,需要构建项目:

Terminal window
1
npm run build

使用PM2启动项目

使用以下命令启动项目:

Terminal window
1
pm2 start ecosystem.config.js --env production

该命令会根据ecosystem.config.js中的配置,以生产环境启动NestJS项目。

总结

本文详细介绍了如何区分开发环境和生产环境及其配置,包括使用环境变量、配置不同的数据库连接、加载不同的配置文件以及如何使用PM2在生产环境中部署NestJS项目。通过合理区分和配置不同的环境,可以更好地管理和维护项目,提升开发和部署效率。

美团外卖红包 饿了么红包 支付宝红包