Ошибка создания: SyntaxError: Нет числа после знака минус в JSON в позиции 1 (строка 1, столбец 2) )
в JSON.parse()
в parseJSONFromBytes (node:internal/deps/undici/undici:4292:19)
в SuccessSteps (node:internal/deps/undici/undici:4274:27)
atfullReadBody (node:internal/deps/undici/undici
atprocess.processTicksAndRejections (node:internal/ process/task_queues:95:5)
в async ConsumerBody (node:internal/deps/undici/undici:4283:7)
в асинхронном POST (webpack-internal:///(rsc)/./app/api/admin/products/route.ts:94: 29)
Вот мой код маршрутизатора:
Код: Выделить всё
import { NextResponse } from "next/server";
import { connectMongoDB } from "@/app/lib/mongodb";
import { getServerSession } from "next-auth";
import Product from "@/app/lib/models/product";
import path from "path";
import fs from "fs";
export const dynamic = 'force-dynamic';
export const revalidate = 0;
function slugify(text: string): string {
return text
.toLowerCase()
.replace(/[^a-z0-9]+/g, "-")
.replace(/(^-|-$)+/g, "");
}
export async function POST(req: Request) {
try {
await connectMongoDB();
const session = await getServerSession();
if (session?.user?.email !== process.env.ADMIN_EMAIL) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const productData = await req.json();
let bannerPath = "";
if (productData.banner) {
const matches = productData.banner.match(/^data:(.+);base64,(.+)$/);
if (matches) {
const [, mimeType, base64Data] = matches;
const fileExt = mimeType.split("/")[1];
if (!["jpeg", "jpg", "png", "webp"].includes(fileExt)) {
return NextResponse.json(
{
error:
"Invalid file format. Only JPEG, JPG, PNG, and WEBP are allowed.",
},
{ status: 400 }
);
}
const uploadDir = path.join(process.cwd(), "public", "banner");
if (!fs.existsSync(uploadDir)) {
fs.mkdirSync(uploadDir, { recursive: true });
}
const slugifiedName = slugify(productData.name || "product");
const filename = `${slugifiedName}.${fileExt}`;
const filepath = path.join(uploadDir, filename);
const buffer = Buffer.from(base64Data, "base64");
fs.writeFileSync(filepath, buffer);
bannerPath = `/banner/${filename}`;
}
}
const { ...createData } = productData;
if (bannerPath) {
createData.banner = bannerPath;
}
const newProduct = await Product.create(createData);
return NextResponse.json(newProduct);
} catch (error) {
console.error("Create error:", error.stack);
return NextResponse.json(
{ error: "Failed to create product" },
{ status: 500 }
);
}
}
Код: Выделить всё
{
"name": "title",
"subtitle": "subtitle",
"status": "Active",
"description": "description",
"durations": [
{
"lemonId": "123456",
"days": "30",
"name": "Name",
"value": "USD30.00",
"buy_now_url": "URL IN HERE"
},
{
"lemonId": "654321",
"days": "7",
"name": "Name",
"value": "USD30.00",
"buy_now_url": "URL IN HERE"
}
],
"functions": [
"1231231"
],
"requirements": [
{
"text": "213241421"
}
],
"banner": "The base64 data is here (I converted the data to png and verified it and the base64 is correct)."
}
Next.js: 14.2.22
Node.js: v21.7.3
Подробнее здесь: https://stackoverflow.com/questions/793 ... 1-column-2
Мобильная версия