使用 Nest.js 我想修剪()所有@body()输入值

Yag*_*ago 10 node.js typescript nestjs

我想修剪所有正文值(输入字段开头/结尾处的空白空格)。我不想为每个 API 请求循环所有主体元素来清理字段。

我想知道是否可以覆盖 @body() 注释,并将代码放在那里,或者是否有一个输入格式化程序或管道可以做到这一点。

目前,我正在这样做:

createAccount(@Body() body: any) {
  this.account.create(body.map(s => s.trim()))
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Yag*_*ago 16

谢谢 Uro\xc5\xa1 An\xc4\x91eli\xc4\x87 的建议。我创建了一个 PipeTransform 来处理这个问题:

\n
import { Injectable, PipeTransform, \nArgumentMetadata, BadRequestException } from '@nestjs/common'\n\n@Injectable()\nexport class TrimPipe implements PipeTransform {\n  private isObj(obj: any): boolean {\n    return typeof obj === 'object' && obj !== null\n  }\n\n  private trim(values) {\n    Object.keys(values).forEach(key => {\n      if (key !== 'password') {\n        if (this.isObj(values[key])) {\n          values[key] = this.trim(values[key])\n        } else {\n          if (typeof values[key] === 'string') {\n            values[key] = values[key].trim()\n          }\n        }\n      }\n    })\n    return values\n  }\n\n  transform(values: any, metadata: ArgumentMetadata) {\n    const { type } = metadata\n    if (this.isObj(values) && type === 'body') {\n      return this.trim(values)\n    }\n\n    throw new BadRequestException('Validation failed')\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是如何使用它

\n
  @UsePipes(new TrimPipe())\n  createAccount(@Body() body: any) {\n    this.account.create(body)\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

您还可以将其设置为全局管道:

\n
app.useGlobalPipes(new TrimPipe());\n
Run Code Online (Sandbox Code Playgroud)\n

  • 我使用了这个解决方案并且工作了。虽然我遇到一个问题,如果我们在控制器路由中使用可选路径参数,它会抛出错误。对我来说,解决方法是 `if (this.isObj(values) && type === 'body') { return this.trim(values) } else { return value; } }`。因为我不想在类型不是主体时抛出错误。 (2认同)