你可以创建一个 Nest.js 拦截器,以处理 HTTP 请求,并统一返回格式包括 code
、message
和 data
。以下是一个示例拦截器的代码:
import { Injectable, NestInterceptor, ExecutionContext, CallHandler, HttpException, HttpStatus } from '@nestjs/common';
import { Observable, throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
@Injectable()
export class ResponseInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle().pipe(
map((data) => ({
code: 200, // 自定义成功状态码
message: 'Success', // 自定义成功消息
data, // 返回数据
})),
catchError((error) => {
// 自定义错误处理逻辑
const errorMessage = error.message || 'Internal Server Error';
const statusCode = error instanceof HttpException ? error.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR;
return throwError(new HttpException(
{
code: statusCode,
message: errorMessage,
data: null, // 可选的错误数据
},
statusCode,
));
}),
);
}
}
在上述代码中,我们创建了一个名为 ResponseInterceptor
的拦截器,它实现了 Nest.js 的 NestInterceptor
接口。在 intercept
方法中,我们通过 next.handle()
获取到请求处理的 Observable,然后使用 map
操作符对返回数据进行包装,以满足统一的格式要求。
要在上述代码中处理异常情况并正确返回错误码,你可以在拦截器中添加错误处理逻辑,并自定义错误格式。
我们使用 catchError
操作符捕获异常,并将其转化为统一格式的错误响应。如果发生异常,我们创建一个包含自定义错误码、错误消息和可选的错误数据的 HttpException
,并将其抛出。
这样,当控制器方法或服务方法中出现异常时,拦截器将会捕获并返回一个包含错误信息的响应。你可以根据需要自定义错误码、错误消息和错误数据,以满足项目的需求。
以下是一个示例,展示如何在拦截器中处理异常并返回错误响应:
你可以将这个拦截器应用于控制器方法或整个模块,以确保每个请求都会经过它,并返回统一格式的响应。以下是如何在控制器方法上应用该拦截器的示例:
import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { ResponseInterceptor } from './response.interceptor';
@Controller('example')
@UseInterceptors(ResponseInterceptor) // 应用拦截器
export class ExampleController {
@Get()
async getData() {
// 模拟返回数据
const data = { message: 'Hello, Nest.js!' };
return data;
}
}
现在,每次调用 getData
控制器方法时,它都会自动经过 ResponseInterceptor
拦截器,并返回统一格式的响应。
请根据你的需求自定义成功状态码、成功消息和其他返回数据,以满足项目的要求。此外,你还可以在拦截器中处理错误情况,以确保错误响应也符合统一的格式。