全栈之路-Nest环境变量和全局拦截配置

220 阅读3分钟

当构建 Nest 应用程序时,全局配置非常重要。它允许你在整个应用程序中统一配置环境变量、全局返回参数和异常拦截等设置

环境变量配置

在开发应用程序时,使用环境变量可以轻松地管理不同环境下的配置。下面是使用 yaml 的示例(安装插件过程已省略)

  1. 首先,新建 .dev.yaml 文件,有其他环境的可创建多个配置文件,随便写入些变量:
MYSQL_CONFIG:
  name: "test"
  type: "mysql"
  host: "localhost"
  port: 3306
  username: "root"
  password: "root"
  database: "test"
  entities: "mysql" 
  synchronize: true
  1. 创建一个工具函数读取配置 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;
};

  1. 在应用程序的入口文件中,引入并加载环境变量:

安装 @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],
        }),
    ]
})
  1. 在应用程序中使用环境变量:
import { getConfig } from '@/utils/index';

const { MYSQL_CONFIG } = getConfig();

console.log(MYSQL_CONFIG.name) // user-test

全局返回参数配置

Nest 提供了一个装饰器 @UseInterceptors,可以在应用程序的全局范围内配置全局返回参数。

  1. 创建一个全局的返回参数拦截器:
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 的全局返回参数拦截器,它将每个响应的数据封装在一个对象中。

  1. 在应用程序的入口文件 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,可以在应用程序的全局范围内配置全局异常拦截器。

  1. 创建一个全局的异常拦截器:
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 格式的响应。

  1. 在应用程序的入口文件中,将全局异常拦截器应用到全局范围:
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 开发中取得成功!