NestJS 返回 HTTP 请求的结果

作者:编程家 分类: 编程代码 时间:2025-07-24

使用 NestJS 框架开发 Web 应用程序时,我们经常需要返回 HTTP 请求的结果。无论是返回成功的响应还是处理错误的响应,NestJS 提供了丰富的功能来处理和生成这些结果。本文将介绍如何使用 NestJS 返回 HTTP 请求的结果,并提供一些实际案例代码。

返回成功的响应

当我们需要返回一个成功的响应时,可以使用 NestJS 提供的`@Res()`装饰器和`Response`对象。通过设置`Response`对象的状态码、头部信息和正文内容,我们可以返回一个符合预期的成功响应。

下面是一个简单的例子,演示了如何返回一个带有自定义消息的成功响应:

typescript

import { Controller, Get, Res } from '@nestjs/common';

import { Response } from 'express';

@Controller('users')

export class UsersController {

@Get()

getUsers(@Res() res: Response) {

const users = ['Alice', 'Bob', 'Charlie'];

return res.status(200).json({ message: '获取用户列表成功', data: users });

}

}

在上述代码中,我们使用`@Get()`装饰器将`getUsers()`方法映射到`/users`路径。在方法中,我们使用`@Res()`装饰器将`Response`对象注入到`res`参数中。然后,我们使用`res.status(200)`设置响应的状态码为 200(成功)。最后,我们使用`res.json()`方法返回一个 JSON 对象,其中包含自定义的消息和数据。

处理错误的响应

当处理出现错误的情况时,我们可以使用 NestJS 的异常处理机制来返回错误的响应。通过抛出一个自定义的异常类,我们可以指定错误的状态码和消息,从而返回一个符合预期的错误响应。

下面是一个示例,演示了如何处理用户不存在的情况,并返回一个带有错误消息的响应:

typescript

import { Controller, Get, Param, NotFoundException } from '@nestjs/common';

@Controller('users')

export class UsersController {

private users = ['Alice', 'Bob'];

@Get(':id')

getUserById(@Param('id') id: string) {

const user = this.users[id];

if (!user) {

throw new NotFoundException('用户不存在');

}

return user;

}

}

在上述代码中,我们使用`@Get(':id')`装饰器将`getUserById()`方法映射到`/users/:id`路径。在方法中,我们通过`@Param('id')`装饰器获取 URL 参数中的`id`值,并根据该值来获取对应的用户。

如果用户不存在,我们可以抛出一个`NotFoundException`异常,并指定错误的消息。NestJS 的异常过滤器会捕获该异常,并自动返回一个带有状态码 404(资源未找到)和自定义错误消息的响应。

使用拦截器统一处理结果

除了直接在控制器方法中处理结果外,我们还可以使用 NestJS 的拦截器来统一处理返回的结果。拦截器可以在控制器方法执行前后对结果进行处理,实现全局的功能,例如日志记录、结果转换等。

下面是一个示例,演示了如何使用拦截器来统一处理返回结果,并在正文中添加一个时间戳:

typescript

import { Controller, Get, UseInterceptors } from '@nestjs/common';

import { ResponseInterceptor } from './response.interceptor';

@Controller('users')

@UseInterceptors(ResponseInterceptor)

export class UsersController {

@Get()

getUsers() {

return ['Alice', 'Bob', 'Charlie'];

}

}

在上述代码中,我们使用`@UseInterceptors()`装饰器将`ResponseInterceptor`拦截器应用到`UsersController`控制器上。该拦截器会在控制器方法执行后拦截结果,并对结果进行处理。

`ResponseInterceptor`拦截器的实现如下:

typescript

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';

import { Observable } from 'rxjs';

import { map } from 'rxjs/operators';

@Injectable()

export class ResponseInterceptor implements NestInterceptor {

intercept(context: ExecutionContext, next: CallHandler): Observable {

return next.handle().pipe(

map(data => {

return {

timestamp: new Date().toISOString(),

data,

};

}),

);

}

}

在上述代码中,我们实现了一个`ResponseInterceptor`拦截器类,并实现了`NestInterceptor`接口。在`intercept()`方法中,我们通过调用`next.handle()`来执行下一个处理程序(控制器方法),并通过`pipe()`和`map()`操作符对结果进行处理。

在`map()`操作符中,我们添加了一个时间戳字段,并将原始结果作为`data`字段返回。这样,无论控制器方法返回什么结果,都会被拦截器统一处理,并在正文中添加时间戳。

通过使用 NestJS 提供的功能,我们可以轻松地返回 HTTP 请求的结果。无论是返回成功的响应还是处理错误的响应,NestJS 提供了丰富的工具和机制来满足我们的需求。我们可以使用`@Res()`装饰器和`Response`对象来返回成功的响应,使用异常处理机制来处理错误的响应,还可以使用拦截器来统一处理返回的结果。这些功能的结合使用,可以使我们的代码更加简洁、可维护,提高开发效率。

希望本文能帮助你理解如何使用 NestJS 返回 HTTP 请求的结果,并通过实际案例代码进行演示。无论是处理成功的响应还是处理错误的响应,NestJS 都提供了灵活且强大的功能来满足各种需求。如果你正在开发基于 NestJS 的 Web 应用程序,相信本文对你会有所帮助。祝你在 NestJS 的开发之路上取得更多的成功!

参考代码

typescript

import { Controller, Get, Res } from '@nestjs/common';

import { Response } from 'express';

@Controller('users')

export class UsersController {

@Get()

getUsers(@Res() res: Response) {

const users = ['Alice', 'Bob', 'Charlie'];

return res.status(200).json({ message: '获取用户列表成功', data: users });

}

}

import { Controller, Get, Param, NotFoundException } from '@nestjs/common';

@Controller('users')

export class UsersController {

private users = ['Alice', 'Bob'];

@Get(':id')

getUserById(@Param('id') id: string) {

const user = this.users[id];

if (!user) {

throw new NotFoundException('用户不存在');

}

return user;

}

}

import { Controller, Get, UseInterceptors } from '@nestjs/common';

import { ResponseInterceptor } from './response.interceptor';

@Controller('users')

@UseInterceptors(ResponseInterceptor)

export class UsersController {

@Get()

getUsers() {

return ['Alice', 'Bob', 'Charlie'];

}

}

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';

import { Observable } from 'rxjs';

import { map } from 'rxjs/operators';

@Injectable()

export class ResponseInterceptor implements NestInterceptor {

intercept(context: ExecutionContext, next: CallHandler): Observable {

return next.handle().pipe(

map(data => {

return {

timestamp: new Date().toISOString(),

data,

};

}),

);

}

}

以上就是关于使用 NestJS 返回 HTTP 请求结果的文章的全部内容。希望本文对你有所帮助!