使用Ajax将参数和文件发送到NodeJs

时间:2018-08-08 16:17:41

标签: javascript ajax express post

实际上,我的代码有问题,我看不出问题出在哪里。

我有这个AJAX部分,它从表单和参数中获取文件并将其发送到我的nodejs服务器:

var layerID = 2;
var formData = new FormData($("#formid")[0]);
formData.append('layer', layerID);
  $.ajax({
     url: "http://localhost:3000/file-upload",
     type: 'POST',
     data: formData,
     cache: false,
     contentType: false,
     processData: false
  });

我有Express这部分,应该用来接收文件和参数:

app.use(bodyParser.urlencoded({
   extended: false
}))

app.post('/file-upload', function (req, res) {
  console.log('params: ' + req.params);
    console.log('body: ' + req.body);
    console.log('query: ' + req.query);
  upload(req, res, function (err) {
    if (err) {
      errorHandler
      return
    } else {
      successHandler
    }
  })
})

我的问题是我可以正确接收文件,但是在我的nodejs服务器中没有收到参数“ layer”。有人可以帮我纠正此错误吗?谢谢。

3 个答案:

答案 0 :(得分:1)

您要发布多部分数据,但是您只有urlencoded数据的正文解析器。

请参阅body parser的文档:

  

由于多主体的复杂性和   通常是大自然。对于多部分实体,您可能会感兴趣   以下模块:

     
      
  • busboy和connect-busboy
  •   
  • 多方和连接多方
  •   
  • 可塑
  •   
  • multer
  •   

答案 1 :(得分:1)

您可以使用multiparty之类的包通过以下方式解析多部分数据。还有其他软件包。

后端代码

const multiparty = require('multiparty');

         // Define POST route
 app.post('/file-upload', function (req, res) {
     const form = new multiparty.Form();

     form.parse(request, async (error, fields, files) => {
       if (error) throw new Error(error);

       try {
         const path = files.file[0].path;
         const layer = fields && fields.layer && fields.layer[0]
         const buffer = fs.readFileSync(path);

         // TODO 

         return response.status(200).send(data);
       } catch (error) {
         return response.status(400).send(error);
       }
     });
 }

您可以通过这种方式使用它。您可以从字段中阅读。

客户代码

const formData = new FormData();
formData.append('file', fileObj);

uploadHandler(formData) // this function will make an API call

现在您将可以得到files.file[0]

答案 2 :(得分:0)

我找到了解决方案,解决方案是简单地将我的req.body日志移动到上载函数中,并这样调用:console.log(“ layer:” + req.body ['layer']); < / p>