Маршрут API Next.js App Router: @ffmpeg-installer/ffmpeg выдает ошибку «Модуль не найден» и «Относительный импорт серверJavascript

Форум по Javascript
Ответить
Anonymous
 Маршрут API Next.js App Router: @ffmpeg-installer/ffmpeg выдает ошибку «Модуль не найден» и «Относительный импорт сервер

Сообщение Anonymous »

Я пытаюсь преобразовать видеофайл WebM в MP4 с помощью fluent-ffmpeg и @ffmpeg-installer/ffmpeg по маршруту API Next.js 14 (с использованием App Router). Тот же код отлично работал в автономном сценарии Node.js, но при перемещении в Next.js во время выполнения я получаю ошибку.

Код: Выделить всё

import { NextRequest, NextResponse } from "next/server";
import { getSession } from "@/lib/session";
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import ffmpeg from "fluent-ffmpeg";
import ffmpegInstaller from "@ffmpeg-installer/ffmpeg";
import { writeFile, unlink, mkdir, readFile } from "fs/promises";
import { existsSync } from "fs";
import path from "path";
import { tmpdir } from "os";

const s3Client = new S3Client({
region: process.env.AWS_REGION!,
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!
}
});

ffmpeg.setFfmpegPath(ffmpegInstaller.path);

export async function POST(request: NextRequest) {
try {
const user = await getSession();
if (!user) {
return NextResponse.json(
{ success: false, message: "Unauthorized" },
{ status: 401 }
);
}

const formData = await request.formData();
const file = formData.get("file") as File;

if (!file) {
return NextResponse.json(
{ success: false, message: "No file found" },
{ status: 400 }
);
}

const tempDir = path.join(tmpdir(), "video-conversion");
if (!existsSync(tempDir)) {
await mkdir(tempDir, { recursive: true });
}

const inputPath = path.join(tempDir, `${Date.now()}-input.webm`);
const outputPath = path.join(tempDir, `${Date.now()}-output.mp4`);

// Write uploaded file to disk
const buffer = Buffer.from(await file.arrayBuffer());
await writeFile(inputPath, buffer);

// Convert video using ffmpeg
await new Promise((resolve, reject) => {
ffmpeg(inputPath)
.outputOptions(["-c:v libx264", "-preset fast", "-crf 23", "-r 30"])
.toFormat("mp4")
.on("end", () => resolve())
.on("error", err => reject(err))
.save(outputPath);
});

// Upload to S3
const key = `${user.id}/${Date.now()}.mp4`;
const convertedBuffer = await readFile(outputPath);

await s3Client.send(
new PutObjectCommand({
Bucket: process.env.AWS_S3_BUCKET!,
Key: key,
Body: convertedBuffer,
ContentType: "video/mp4"
})
);

// Cleanup temp files
await Promise.all([
unlink(inputPath).catch(() => {}),
unlink(outputPath).catch(() => {})
]);

return new NextResponse(convertedBuffer, {
headers: {
"Content-Type": "video/mp4",
"Content-Length": convertedBuffer.length.toString()
}
});
} catch (error) {
console.error("Video conversion failed:", error);
return NextResponse.json(
{ success: false, message: "Video conversion failed" },
{ status: 500 }
);
}
}
Это работало, когда я делал это в узле js, однако когда я попытался преобразовать его в следующий, я получил следующую ошибку:

Код: Выделить всё

 ⨯ ./node_modules/@ffmpeg-installer/ffmpeg
Module not found: Can't resolve './ROOT/node_modules/@ffmpeg-installer/ffmpeg/node_modules/@ffmpeg-installer/win32-x64/package.json'
server relative imports are not implemented yet. Please try an import relative to the file you are importing from.
Вопросы
Почему @ffmpeg-installer/ffmpeg завершается с ошибкой разрешения импорта в Next.js?
Будем очень благодарны за любую помощь или обходной путь!

Подробнее здесь: https://stackoverflow.com/questions/798 ... -not-found
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»