【问题标题】:FormData with NextJS API带有 NextJS API 的 FormData
【发布时间】:2021-07-22 02:29:39
【问题描述】:

背景

我正在尝试使用 NextJS 和 react-redux 创建一个简单的 CRUD 应用程序,所以它的作用是保存人们的联系人。所以当添加联系人时,我试图将一些数据与文件一起发送到 NextJS API。

问题

ContactAction.js

从 redux 操作发出 POST 请求以添加联系人

export const addContact = (data) => async (dispatch) => {
 try {
      var formData=new FormData();
      formData.append('name',data.Name);
      formData.append('email',data.Email);
      formData.append('phone',data.Phone);
      formData.append('image',data.Image);
      let response= await Axios.post(`http://localhost:3000/api/contact/addContact`,formData,{
         headers:{
             'x-auth-token':localStorage.getItem('token')
         }
      });
   } catch (error) {
       console.log(error);
   }
}

addContact.js

这是/api/contact/中的API路由

  const handler = async (req, res) => {
   switch(req.method){
    case "POST":{
       await addContact(req,res)
       }
     }
   }
   const addContact = async  (req, res) => { 
     console.log(req.body);
    // do some stuff here and send response
   }

这是我在登录后在终端中得到的,在登录req.files时文件也是乱码@

目前的努力

我尝试使用第三方软件包,例如 formidableformidable-serverless,但没有成功。所以一天后,我使用了一个名为 multiparty 的包。

addContact.js

  const handler = async (req, res) => {
   switch(req.method){
    case "POST":{
      let form = new multiparty.Form();
      let FormResp= await new Promise((resolve,reject)=>{
       form.parse(req,(err,fields,files)=>{
        if(err) reject(err)
        resolve({fields,files})
        });
      }); 
      const {fields,files} = FormResp;
      req.body=fields;
      req.files=files;
       await addContact(req,res)
       }
     }
   }
   const addContact = async  (req, res) => { 
     console.log(req.body); //Now i get an Object which i can use
    // do some stuff here and send response
   }

上述解决方案显然是多余的,可能不是最好的解决方法,而且我不想将这 7 8 行添加到每条路线中。

所以如果有人能帮助我理解我做错了什么以及为什么formData 似乎不适用于 NextJS API(当它与 Express 服务器一起使用时),我将不胜感激。

【问题讨论】:

    标签: reactjs next.js


    【解决方案1】:

    FormData 使用multipart/form-data 格式。这不是一个简单的带有正文的POST 请求。它通常用于上传文件,这就是它需要特殊处理的原因。作为替代方案,您可以使用JSON

    【讨论】:

    • 我得到了这么多 Ivan,但如果我使用 JSON,我将无法访问这些文件。这里的问题是我想要带有文本字段的文件。如果不是文件,一个简单的 Object 而不是 formData 就足够了ob
    • 如果我错了,请纠正我,但是 expressjs 还需要一个第三方模块来处理multipart 表单。如果您要发送binary 数据,您别无选择,只能使用multipart 表单。所以你的例子没问题。
    • 你是对的。我希望有一个更好的方法来解决这个问题,但我想这个必须要做。
    猜你喜欢
    • 2021-11-09
    • 2021-06-14
    • 2018-09-28
    • 2020-03-22
    • 1970-01-01
    • 2019-10-15
    • 2016-04-02
    • 2019-05-22
    • 2019-10-28
    相关资源
    最近更新 更多