当构建 Nest 应用程序时,全局配置非常重要。它允许你在整个应用程序中统一配置环境变量、全局返回参数和异常拦截等设置
环境变量配置
在开发应用程序时,使用环境变量可以轻松地管理不同环境下的配置。下面是使用 yaml 的示例(安装插件过程已省略)
- 首先,新建
.dev.yaml文件,有其他环境的可创建多个配置文件,随便写入些变量:
MYSQL_CONFIG:
name: "test"
type: "mysql"
host: "localhost"
port: 3306
username: "root"
password: "root"
database: "test"
entities: "mysql"
synchronize: true
- 创建一个工具函数读取配置
utils/index.ts:
import { parse } from 'yaml';
const path = require('path');
const fs = require('fs');
export const getConfig = () => {
// 此处可根据环境读取不同的配置文件
const yamlPath = path.join(process.cwd(), `./.config/.dev.yaml`);
const file = fs.readFileSync(yamlPath, 'utf8');
const config = parse(file);
return config;
};
- 在应用程序的入口文件中,引入并加载环境变量:
安装 @nestjs/config
pnpm i @nestjs/config
// app.module.ts
import { ConfigModule } from '@nestjs/config';
import { getConfig } from './utils';
@Module({
...
imports:[
ConfigModule.forRoot({
ignoreEnvFile: true,
isGlobal: true,
load: [getConfig],
}),
]
})
- 在应用程序中使用环境变量:
import { getConfig } from '@/utils/index';
const { MYSQL_CONFIG } = getConfig();
console.log(MYSQL_CONFIG.name) // user-test
全局返回参数配置
Nest 提供了一个装饰器 @UseInterceptors,可以在应用程序的全局范围内配置全局返回参数。
- 创建一个全局的返回参数拦截器:
import {
Injectable,
NestInterceptor,
ExecutionContext,
CallHandler,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
interface Response<T> {
data: T;
}
@Injectable()
export class TransformInterceptor<T>
implements NestInterceptor<T, Response<T>>
{
intercept(
context: ExecutionContext,
next: CallHandler,
): Observable<Response<T>> {
return next.handle().pipe(
map((data) => ({
data,
status: 0,
message: 'message',
})),
);
}
}
在上述示例中,我们创建了一个名为 TransformInterceptor 的全局返回参数拦截器,它将每个响应的数据封装在一个对象中。
- 在应用程序的入口文件
main.ts中,将全局返回参数拦截器应用到全局范围:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { TransformInterceptor } from './transform.interceptor';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalInterceptors(new TransformInterceptor());
// ...
await app.listen(3000);
}
bootstrap();
现在,全局返回参数拦截器已经应用到应用程序的全局范围。
全局异常拦截配置
Nest 提供了一个装饰器 @Catch,可以在应用程序的全局范围内配置全局异常拦截器。
- 创建一个全局的异常拦截器:
import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';
@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
catch(exception: any, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
const status = exception instanceof HttpException ? exception.getStatus() : 500;
response.status(status).json({
statusCode: status,
message: exception.message || 'Internal server error',
});
}
}
在上述示例中,我们创建了一个名为 AllExceptionsFilter 的全局异常拦截器,它将所有异常统一返回为 JSON 格式的响应。
- 在应用程序的入口文件中,将全局异常拦截器应用到全局范围:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { AllExceptionsFilter } from './all-exceptions.filter';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new AllExceptionsFilter());
// ...
await app.listen(3000);
}
bootstrap();
现在,全局异常拦截器已经应用到应用程序的全局范围。
总结
在本篇博客中,我们学习了如何在 Nest 中进行全局配置。我们了解了如何配置环境变量、全局返回参数和全局异常拦截器。这些全局配置有助于我们在应用程序中统一管理和处理配置、返回参数和异常。
希望本篇博客对你有所帮助!如果你还有其他问题或需要进一步的帮助,请随时提问。祝你在 Nest 开发中取得成功!