为什么 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,
我正在尝试使用 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,