如何區分開發環境和線上環境及其配置(NestJS + MySQL + TypeScript)

在上一篇https://tw.blog.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

安裝 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項目。通過合理區分和配置不同的環境,可以更好地管理和維護項目,提升開發和部署效率。