Nodejs 新手求教 nest.js 的问题

发布于 1周前 作者 gougou168 来自 nodejs/Nestjs

刚入门 nest.js 请问各位大佬,在 nest.js 中如何处理返回字段。和 java 中 VO 一样,写一些 VO 的类,用于处理返回的接口字段以及过滤掉未定义的字段。
网上找了好多,都没有类似的答案。
就比如数据库中查出来的字段有很多,但是最后我需要过滤一层再返回给前端,如果通过判断或者解构一层再组装每个都需要处理,感觉很乱,我希望通过 DTO 类似的方式,用 JAVA 中应该是 VO 。直接过滤掉不匹配的值。
有大佬能给个示范或者提供文章一下
Nodejs 新手求教 nest.js 的问题

20 回复

巧了我刚看的一个项目就是用的 dto
https://github.com/azerothcore/acore-api/blob/master/src/auth/auth.controller.ts

(’/signin’)
async signIn(
() accountDto: AccountDto,
() response: Response,
): Promise<void> {
return this.authService.signIn(accountDto, response);
}


#2 这个好像是过滤 request 的,我再找找看

你算是问对人了,今天刚解决这个问题,其实三楼那个就是,只不过不是一个属性。
app.useGlobalPipes(
new ValidationPipe({
transform: true,
whitelist: true,
forbidNonWhitelisted: true,
errorHttpStatusCode: HttpStatus.UNPROCESSABLE_ENTITY,
exceptionFactory: (errors: ValidationError[]) => {
return new UnprocessableEntityException(
errors
.filter((item) => !!item.constraints)
.flatMap((item) => Object.values(item.constraints))
.join(’; '),
);
},
}),
);

这段代码放在 main.js 的 bootstrap 方法中

你自己研究下吧

从数据库中查就可以直接过滤返回字段呀,比如 mongodb ,就可以填过滤参数呀。

db_users.find({“uid”: 1001}, {“password”: 0, “uid”: 1})

看来用 nestjs 的还是有一些的,同用 nestjs 。

你们 nestjs 应用有部署在 cloudflare or vercel 吗?

没法部署吧,我试过,他是可能是访问的时候启动一下,启动完了保存内存就停了,很多东西这样不好搞。

可以做到,我之前是用响应拦截器里获取响应的对象类型,去读装饰器的标记过滤。

在实体类上用装饰器通过元信息标注哪一些字段需要过滤,在中间件中遍历响应体检查其元信息删除不需要的字段。

有没有参考示例,刚入门还不是特别了解。但是你说的大致意思我明白。对于传入参数原本是通过创建自定义的管道,然后在全局进行绑定,这样就能通过 class-validator 进行 DTO 类型字段的校验。但是我不知道如何进行删除。transform(value, { metatype })只有这两个参数。value 是客户端传入的值,但是我不知道从哪里获取 DTO 类的值。原本是打算获取 DTO 的对象值,然后两个进行遍历,若 value 中的值不存在 DTO 上就删除掉。但是现在困扰在了 DTO 上的值不知道怎么获取。另外传出参数应该也是一样。能否给个示例

这个方式是数据库出来的时候就已经排除了。但是有些情况是我可能在服务层还需要对这些数据进行使用.我希望在返回给客户端期间,增加一个步骤,用于将返回的字段和我定义的 VO 类进行比较,然后返回 VO 类中的的字段

能否给我个示例子。刚入门,对与很多 API 或者使用方式还不太了解,了解不够深,所以有点不知道怎么处理。

#14 这个不是 数据库出来就排除的,你可以验证一下。class-transformer 只是处理 serialize 的行为,对象属性还是可以访问的

那我说错了,不过我更希望能够在返回阶段对数据进行处理。因为这样的话个人感觉更加灵活。请问返回阶段处理 DTO 字段的示例么?

可以像 java 一样写 VO 啊用 ClassSerializerInterceptor ,Vo 类使用 Exclude ,属性使用 Expose

当然,很高兴能帮助你了解 NestJS,这是一个基于 Node.js 的强大框架,用于构建高效、可靠和可扩展的服务器端应用程序。如果你是 Node.js 新手,那么 NestJS 的模块化设计和丰富的功能可能会让你觉得既兴奋又有挑战。

首先,确保你已经安装了 Node.js 和 npm(Node 包管理器)。然后,你可以通过以下步骤创建一个新的 NestJS 项目:

  1. 全局安装 Nest CLI

    npm i -g [@nestjs](/user/nestjs)/cli
    
  2. 创建一个新项目

    nest new project-name
    cd project-name
    
  3. 启动开发服务器

    npm run start
    

此时,你应该能够在浏览器中访问 http://localhost:3000/ 并看到一个欢迎页面。

NestJS 强调模块化,每个模块可以包含控制器、服务、存储库等。下面是一个简单的控制器示例,用于处理 HTTP 请求:

import { Controller, Get } from '[@nestjs](/user/nestjs)/common';

@Controller('hello')
export class HelloController {
  @Get()
  sayHello(): string {
    return 'Hello World!';
  }
}

将这个控制器添加到你的模块中(通常是 app.module.ts),然后重新启动服务器,访问 http://localhost:3000/hello 应该会看到 “Hello World!” 的输出。

这只是 NestJS 功能的冰山一角,建议查阅 官方文档 以获取更多详细信息和高级用法。祝你学习愉快!

回到顶部