为什么 class-validator 装饰器在与 class-transformer 一起使用时会删除属性

Why are class-validator decorators removing properties when used with class-transformer

我正在尝试使用 class-validator 和 class-transformer 对 Next.js API 路由中的 API 请求执行验证。

我整理了这个基本的 API 处理程序来演示:

import { plainToInstance } from 'class-transformer';
import { IsString } from 'class-validator';
import { NextApiRequest, NextApiResponse } from 'next';

class PostBody {
  @IsString()
  public title!: string;

  public content!: string;
}

const validateRequest = (req: NextApiRequest) => {
  const request = plainToInstance(PostBody, req.body);

  console.log(request);
};

const Handler = (req: NextApiRequest, res: NextApiResponse) => {
  validateRequest(req);
  res.status(200).json({ message: 'ok' });
};

export default Handler;

如果我使用带正文的邮递员发送请求:

{ "title": "Test", "content": "Hello world" }

这被记录到控制台: PostBody { content: 'Hello world' }

如果我删除 @IsString() 装饰器,则会记录以下内容:PostBody { title: 'Test', content: 'Hello world' }.

有人知道为什么 class-validator 装饰器似乎要删除属性吗?

使用:

"next": "^12.1.0",
"class-transformer": "^0.5.1",
"class-validator": "^0.13.2",

问题可能是你的babel没有配置好

尝试将其放入您的 babel.config.js(如果您还没有,请创建文件):

module.exports = {
  presets: ['next/babel'],
  plugins: [['@babel/plugin-proposal-decorators', { 'legacy': true }]],
};

另外别忘了将这两个 devDependencies 放入您的 package.json:

"@babel/core": "^7.12.9",
"@babel/plugin-proposal-decorators": "^7.17.8",

对于打字稿,将这两行输入到您的 tsconfig.json

"experimentalDecorators": true,
"emitDecoratorMetadata": true,