Я пытаюсь использовать class-validator и class-transformer для проверки запросов API в маршруте API Next.js.
Я собрал этот базовый обработчик 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.info(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",
Проблема может заключаться в том, что ваш 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,
Я отметил этот ответ как правильный, потому что технически он правильный. Однако я использовал новый компилятор SWC от nextjs, который в настоящее время не полностью поддерживает эти экспериментальные декораторы.