如何區分開發環境和線上環境及其配置(NestJS + MySQL + TypeScript)
- 690字
- 3分鐘
- 2024-07-06
在上一篇https://tw.blog.jasonzk.com/nestjs/nesttsmysql/文章中,我們詳細介紹了如何搭建開發NestJS+MySQL+TypeScript環境。本文將在此基礎上,詳細介紹如何區分開發環境和線上環境,不同配置的加載以及如何使用PM2在生產環境中部署NestJS項目。
使用環境變量區分環境
首先,我們需要在項目根目錄下創建兩個環境變量文件:.env.development
和.env.production
,分別用於開發環境和生產環境,並安裝dotenv。
.env.development
1NODE_ENV=development2DB_HOST=localhost3DB_PORT=33064DB_USERNAME=root5DB_PASSWORD=password6DB_DATABASE=test
.env.production
1NODE_ENV=production2DB_HOST=your-production-host3DB_PORT=33064DB_USERNAME=your-production-username5DB_PASSWORD=your-production-password6DB_DATABASE=your-production-database
安裝 dotenv
1npm install dotenv
在src
目錄下創建一個config
目錄,並在其中創建一個configuration.ts
文件,用於加載環境變量:
1import * as dotenv from "dotenv";2
3const env = process.env.NODE_ENV || "development";4
5dotenv.config({ path: `.env.${env}` });6
7export 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
中,使用ConfigModule
和TypeOrmModule
加載數據庫配置:
1import { Module } from "@nestjs/common";2import { ConfigModule, ConfigService } from "@nestjs/config";3import { TypeOrmModule } from "@nestjs/typeorm";4import configuration from "./config/configuration";5import { UsersModule } from "./users/users.module";6import { User } from "./users/user.entity";7import { AppController } from "./app.controller";8import { 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})35export class AppModule {}
加載不同的配置文件
為了確保配置文件的加載,ConfigModule
的forRoot
方法需要正確設置isGlobal
和load
選項,TypeOrmModule
的forRootAsync
方法用於異步加載配置,並使用ConfigService
獲取數據庫連接信息。
在開發環境中啟動項目
在開發環境中,使用Nest CLI的start
命令啟動項目:
1npm run start
在生產環境中部署項目
在生產環境中,我們推薦使用PM2來管理和運行NestJS項目。
安裝PM2
首先,全局安裝PM2:
1npm install -g pm2
配置PM2
在項目根目錄下創建一個ecosystem.config.js
文件,配置PM2:
1module.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};
構建項目
在啟動項目之前,需要構建項目:
1npm run build
使用PM2啟動項目
使用以下命令啟動項目:
1pm2 start ecosystem.config.js --env production
該命令會根據ecosystem.config.js
中的配置,以生產環境啟動NestJS項目。
總結
本文詳細介紹了如何區分開發環境和生產環境及其配置,包括使用環境變量、配置不同的數據庫連接、加載不同的配置文件以及如何使用PM2在生產環境中部署NestJS項目。通過合理區分和配置不同的環境,可以更好地管理和維護項目,提升開發和部署效率。