当我发送表单数据,然后try 记录"req"时.文件"或"请求.身体描述'在后端,我得到'未定义'.如果我只是记录"req".然后我得到:

------WebkitformboundaryABQZV2VOXZV0ZA

------WebkitformboundaryABQZV2VOXZV0ZA

测试123

// Front-End (Next.js)

const AddPhotos = () => {
  const uploadImg = async (e) => {
    e.preventDefault();
    try {
      const file = e.target.querySelector('#image').files[0];
      const desc = e.target.querySelector('#desc').value;
      
      const formData = new FormData();
      formData.append('image', file);
      formData.append('description', desc);
      
      const res = await fetch('/api/uploadImg', {
        method: 'POST',
        headers: {
          'Content-Type': 'multipart/form-data'
        },
        body: formData
      });
      
      const data = await res.json();
      console.log(data);
    } catch (err) {
        console.log(err)
    }
  }
  
  return (
    <div>
      <form onSubmit={uploadImg}>
        <input
          type='file'
          name='image'
          id='image'
          accept='image/*'
        />
        <input type='text' id='desc' />
        <input type='submit' value='Upload'/>
      </form>
    </div>
  );
};

export default AddPhotos;


// Back-End (Next.js built-in API)

export default async function handler(req, res) {
  try {
    const file = req.file;
    const desc = req.body.description;
    
    console.log(file)
    
    res.json(true);
  } catch(err) {
      console.log(err)
      res.status(404).json(`${err}`)
  }
}

推荐答案

您应该遵循这个简单的guide,因为它简要说明了如何制作一个中间件,该中间件将使用next connect解析表单数据,并专用于next.js.

下一个js(Express.js)代码段

const { createRouter } = require("next-connect");
import multer from "multer";

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

const apiRouter = createRouter();

apiRouter.use(upload.single("file"))
    .post((req, res) => {
    console.log(req.file)
    res.send();
});

export default apiRouter.handler({
    onError: (err, req, res) => {
        console.error(err.stack);
        res.status(500).end("Something broke!");
    },
    onNoMatch: (req, res) => {
        res.status(404).end("Page is not found");
    }
});

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

指数使用示例输入编辑js Hello页面

const axios = require("axios");

async function uploadFile(e) {
    const firstFile = e?.target?.files?.[0];
    const postData = new FormData();
    postData.append("file", firstFile);
    await axios.post("/api/hello", postData, {
        headers: {
            "Content-Type": "multipart/form-data"
        }
    });
}

export default function Home() {
    return (
        <div>
            <input type="file" name="test" id="test" onChange={uploadFile}/>
        </div>
    );
}

Javascript相关问答推荐

Math.random超出了最大调用堆栈

使用Element.children在前后移动 node

TestCafe预计文本等于以下内容之一

React:如何将表格收件箱正确渲染为表格主体内的组件?

在shiny 模块中实现JavaScript

如何制作删除按钮以从列表中删除该项目所属的项目?

基于每个索引迭代嵌套对象

禁用从vue.js 2中的循环创建的表的最后td的按钮

是否有方法在OpenWeatherMap API中获取过go 的降水数据?

Vue:ref不会创建react 性属性

Redux工具包查询(RTKQ)端点无效并重新验证多次触发

窗口.getComputedStyle()在MutationObserver中不起作用

引用在HTMLAttributes<;HTMLDivElement>;中不可用

从包含数百行的表中获取更改后的值(以表单形式发送到后端)的正确方法是什么?

JavaScript是否有多个`unfined`?

Jest toHaveBeenNthCalledWith返回当前设置的变量值,而不是调用时的值

AddEventListner,按键事件不工作

如何使本地html页面在重新加载时保持当前可隐藏部分的打开状态?

将多个文本框中的输出合并到一个文本框中

在JS/TS中将复杂图形转换为数组或其他数据 struct