我试图使用类验证器和类转换器对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' }。
有人知道为什么类验证器装饰器似乎要删除属性吗?
使用:
"next": "^12.1.0",
"class-transformer": "^0.5.1",
"class-validator": "^0.13.2",发布于 2022-03-29 10:37:17
问题可能是您的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,https://stackoverflow.com/questions/71554886
复制相似问题