如何区分开发环境和线上环境及其配置(NestJS + MySQL + TypeScript)
- 688字
- 3分钟
- 2024-07-06
在上一篇https://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
install 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项目。通过合理区分和配置不同的环境,可以更好地管理和维护项目,提升开发和部署效率。


