Загрузка файлов NextJs и Multer 405 Метод запрещен с использованием следующего подключения

Я пытаюсь загрузить аудиофайлы с помощью своего приложения NextJs и отправить их на внешний API, откуда я хочу получить ответ, но получаю error: "Method 'POST' Not Allowed"

Это мой код внешнего интерфейса:

      const MediaUploader = () => {
  const [file, setFile] = useState(null);
  const fileInput = React.createRef();

  const chooseFileHandler = (e) => {
    fileInput.current.click();
  };

  const onFileChange = (e) => {
    console.log(e.target.files);
    setFile(e.target.files[0]);
  };

  const submit = (e) => {
    console.log("submited");
    const formData = new FormData();
    formData.append("mediaFile", file);

    fetch("/api/media", {
      method: "POST",
      body: formData,
      
    })
      .then((res) => res.json())
      .then((data) => {
        console.dir(data, " responsi pi te uploaderi");
      })
      .catch((err) => console.log(err, "error pi te uploaderi"));
  };

  return (
    <>
      <h1>{file ? file.name : "choose a fileee"}</h1>
      <input type="file" ref={fileInput} onChange={onFileChange} />
      <button onClick={chooseFileHandler}>Choose File</button>
      <button onClick={submit}>Submittt</button>
    </>
  );
};

export default MediaUploader;

И это мой маршрут API NextJs с использованием следующего подключения:

      import nc from "next-connect";
import multer from "multer";
//const multer = require("multer");

const { RevAiApiClient } = require("revai-node-sdk");

const access_token = process.env.NEXT_PUBLIC_REVAI_ACCESS_TOKEN;
const mediaPath = process.env.NEXT_PUBLIC_MEDIA_PATH || "public/media/";
const port = 3000;
const webhookBaseUrl =
  process.env.NEXT_PUBLIC_WEBHOOK_BASE_URL || `http://localhost${port}`;


const asyncClient = new RevAiApiClient(access_token);

export const config = {
  api: {
    bodyParser: false,
  },
};



const upload = multer({
  storage: multer.diskStorage({
    destination: (req, file, cb) => {
      cb(null, req.mediaPath);
    },
    filename: (req, file, cb) => cb(null, file.originalname),
  }),
});

const apiRoute = nc({
  onError(error, req, res) {
    res
      .status(501)
      .json({ error: `Sorry something Happened! ${error.message}` });
  },
  onNoMatch(req, res) {
    res.status(405).json({ error: `Method '${req.method}' Not Allowed` });
  },
});

apiRoute.use((req, res, next) => {
  req.asyncClient = asyncClient;
  req.mediaPath = mediaPath;
  req.webhookBaseUrl =
    process.env.WEBHOOK_BASE_URL || `http://localhost${port}`;
  next();
});

apiRoute.use("/media", mediaPath);

const sendFile = multer({ upload });


apiRoute.post("/", sendFile.single("mediaFile"), async (req, res) => {
  
  try {
    const media_url = `${req.webhookBaseUrl}/media/${req.file.filename}`;
    const webhook_url = `${req.webhookBaseUrl}/api/job`;
    console.log(`submit job: ${JSON.stringify({ media_url, webhook_url })}`);

    console.log("BODYYY", JSON.parse(JSON.stringify(req.body)));

    const job = await req.asyncClient.submitJobUrl(media_url, {
      callback_url: webhook_url,
    });

    

    res.json(job);
  } catch (error) {
    console.dir(`Error: ${error}`);
    res.status(500).json({ error });
  }
  //res.status(200).json({ data: "success" });

  return;
});

export default apiRoute;

Однако когда я делаю это в apiRoute.post() функция:

      const sendFile = multer({ upload });
apiRoute.use(sendFile.single("mediaFile"));

  apiRoute.post(async (req, res) => {
  try {
    const media_url = `${req.webhookBaseUrl}/media/${req.file.filename}`;
    const webhook_url = `${req.webhookBaseUrl}/api/job`;
    console.log(`submit job: ${JSON.stringify({ media_url, webhook_url })}`);

    console.log("BODYYY", JSON.parse(JSON.stringify(req.body)));

    const job = await req.asyncClient.submitJobUrl(media_url, {
      callback_url: webhook_url,
    });

    res.json(job);
  } catch (error) {
    console.dir(`Error: ${error}`);
    res.status(500).json({ error });
  }
  //res.status(200).json({ data: "success" });

  return;
});

я не понимаю 405 ошибка, он отправляет ответ API, но я получаю undefined для ${req.file.filename} в этой строке: const media_url =${req.webhookBaseUrl}/media/${req.file.filename}; потому что Multer вообще не загружает файл в указанную папку.

Любая помощь будет оценена.

0 ответов

Другие вопросы по тегам