所需依赖
pnpm i @nestjs/config js-yaml lodash
pnpm i @types/js-yaml @types/lodash cross-env -D
目录结构
|- config
| |- config.yaml
| |- config.local.yaml
| |- config.development.yaml
| |- config.development.local.yaml
| |- config.production.yaml
| |- config.production.local.yaml
|- src
| |- common
| |- config.module.ts
| |- app.module.ts
|- .gitignore
|- nest-cli.json
涉及文件
1、package.json
{
"scripts": {
"build": "cross-env NODE_ENV=production nest build",
"start": "cross-env NODE_ENV=development nest start",
"start:dev": "cross-env NODE_ENV=development nest start --watch",
"start:debug": "cross-env NODE_ENV=development nest start --debug --watch",
"start:prod": "node dist/main",
"start:deploy": "node main.js",
},
"dependencies": {
"@nestjs/config": "^4.0.2",
"js-yaml": "^4.1.1",
"lodash": "^4.17.21"
},
"devDependencies": {
"@types/js-yaml": "^4.0.9",
"@types/lodash": "^4.17.21",
"cross-env": "^10.1.0"
}
}
2、config.module.ts
import { join } from 'path'
import jsYaml from 'js-yaml'
import { merge } from 'lodash'
import { Module } from '@nestjs/common'
import { readFileSync, existsSync } from 'fs'
import { ConfigModule as NestConfigModule } from '@nestjs/config'
@Module({
imports: [NestConfigModule.forRoot({ load: [configuration], isGlobal: true, cache: true })],
})
export class ConfigModule {}
function loadConfig(filePath: string): Record<string, any> {
return existsSync(filePath) ? (jsYaml.load(readFileSync(filePath, 'utf-8')) as Record<string, any>) : {}
}
function configuration() {
const { NODE_ENV } = process.env
const CONFIG_DIR_PATH = NODE_ENV === 'development' ? join(process.cwd(), 'config') : __dirname
const YAML_COMMON_CONFIG_PATH = join(CONFIG_DIR_PATH, 'config.yaml')
const YAML_COMMON_CONFIG_LOCAL_PATH = join(CONFIG_DIR_PATH, 'config.local.yaml')
const YAML_ENV_CONFIG_PATH = join(CONFIG_DIR_PATH, `config.${NODE_ENV || 'development'}.yaml`)
const YAML_ENV_CONFIG_LOCAL_PATH = join(CONFIG_DIR_PATH, `config.${NODE_ENV || 'development'}.local.yaml`)
const COMMON_CONFIG = loadConfig(YAML_COMMON_CONFIG_PATH)
const COMMON_CONFIG_LOCAL = loadConfig(YAML_COMMON_CONFIG_LOCAL_PATH)
const ENV_CONFIG = loadConfig(YAML_ENV_CONFIG_PATH)
const ENV_CONFIG_LOCAL = loadConfig(YAML_ENV_CONFIG_LOCAL_PATH)
const finalConfig = merge(COMMON_CONFIG, COMMON_CONFIG_LOCAL, ENV_CONFIG, ENV_CONFIG_LOCAL)
return finalConfig
}
3、app.module.ts
import { Module } from '@nestjs/common'
import { ConfigModule } from './common/config.module.ts'
@Module({
imports: [ConfigModule]
})
export class AppModule {}
4、.gitignore
.env.local
*.local.yaml
5、nest-cli.json
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"assets": [
{ "include": "../package.json", "outDir": "./dist/package.json" },
{ "include": "../pnpm-lock.yaml", "outDir": "./dist/pnpm-lock.yaml" },
{ "include": "../config/config.yaml", "outDir": "./dist" }
],
"deleteOutDir": true,
"builder": "webpack"
},
"generateOptions": {
"flat": false,
"spec": false
}
}
6、配置参考
server:
port: 3000
globalPrefix: 'api'
defaultPassword: '123456'
isDemo: false
database:
host: '127.0.0.1'
port: 3306
username: 'root'
password: 'root'
database: 'nestjs'
synchronize: false
redis:
host: '127.0.0.1'
port: 6379
password: 'redispassword'
jwt:
secret: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALrVoHV5PAxYfowa
expiresIn: 1800
openai:
baseURL: https://api.deepseek.com
apiKey: sk-zq7G7UOQXlKMWcxYRBXzJc6dV1RulLzmBMJYCBrhxRHIgjE7r
crypto:
RsaPublicKey: |
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC61aB1eTwMWH6MGhQYu4PUFV22
zq7G7UOQXlKMWcxYRBXzJc6dV1RulLzmBMJYCBrhxRHIgjE7r/FauWDgmKkIPZBw
JOFUNZ+GhLpZFWqTRlvq00NqOvM7zxkpNqxyxnOGi94xJStk8L27I9hc8emie+Fe
XEJmVm387NdqQa9DuQIDAQAB
-----END PUBLIC KEY-----
RsaPrivateKey: |
-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALrVoHV5PAxYfowa
FBi7g9QVXbbOrsbtQ5BeUoxZzFhEFfMlzp1XVG6UvOYEwlgIGuHFEciCMTuv8Vq5
YOCYqQg9kHAk4VQ1n4aEulkVapNGW+rTQ2o68zvPGSk2rHLGc4aL3jElK2Twvbsj
2Fzx6aJ74V5cQmZWbfzs12pBr0O5AgMBAAECgYAZjga4irCP77q/ZwHAsEVDyPhc
fMCjLOjE4mHgGJg+qnFmJJGyK7O8vFNqEtSSPemPX+kix8v8IgCdLCX4EmlsH0AO
mFo5QwX9Nay2/jw2fwxsO87D7yKD0z/laZw5bRtaKYog6imqtLLPJXI4TkPJOJha
i0Ps+fxr6qJ+98ff0QJBAONrVJ9adhQmw6Hucn2zk4oFIWArjHISREmPVH33vZgQ
YyLK7RtEq3t3kp3na3UH3z5K+iFEF5oNjhnHO6WhxG8CQQDSUJQHC60z4ok0/ZLj
eaJQE0txLgkGft50LsRXycEjSMVeq+1wwMYSEzbLldkkWOyVKRfuunH60ro/D3Nt
l55XAkEA3dUZM2OzIE77r13/chwTw6LjfoKcOb0VvUdBXKqm1sjNWufkxx+BwirN
6pcNW5f1LDdIq+BWwV+NiBmuVg9oowJAZaXyVZFsLgaQYB8qrmzsaR1aOiKQ1CXf
aHHuDawCgAY89mvMP9G8KaJFupH7OBkOh20sFwLf8eWFhNL37AD60wJBAJUIjI/V
JDUrA0ONcI0xFkWU+TuwYj4CY8s4eo7oSXrOjhy/4Ee57RfiBEpNF18AA9BCTvSS
GUd7GrqUUME8EP8=
-----END PRIVATE KEY-----
使用介绍
1、service 服务使用
import { Injectable } from '@nestjs/common'
import { ConfigService } from '@nestjs/config'
@Injectable()
export class LoginService {
constructor(private readonly configService: ConfigService) {}
public testEnvConfig() {
const dbHost = this.configService.get<string>('database.host','localhost')
}
}
2、main.ts 中使用
import { AppModule } from './app.module'
import { ConfigService } from '@nestjs/config'
async function bootstrap() {
const app = await NestFactory.create(AppModule)
const configService = app.get(ConfigService)
const serverPort = configService.get<number>('server.port', 3000)
await app.listen(serverPort)
console.log('\n--------------------------------------------------')
console.log(`➜ Local: http://localhost:${serverPort}`)
console.log('--------------------------------------------------')
}
bootstrap()