如何使multer正确解析随表格数据发送的客户端请求?

我想将数据从客户端传输到服务器计算机,而这两个计算机都使用Node.js。在客户端上,我正在使用库axiosform-data。在服务器上,我正在使用expressmulter ...

我正在使用的客户端代码如下:

const FormData = require('form-data');
const axios = require('axios');

let form = new FormData();
form.append("user","someuser");

axios({
    method: 'post',url: 'http://localhost:9996/data',data: form
})
.then(function (response) {
     console.log(response.status);
})
.catch(function (response) {
     console.log(response.status);
});

服务器代码如下:

const express = require('express')
const bodyParser = require('body-parser');
const multer  = require('multer')

const app = express();
const upload = multer();
app.use(bodyParser.urlencoded({extended: true}));

app.post('/data',upload.none(),function (req,res,next) {
    console.log(req.body);
    res.sendStatus(200)
})

const port = 9996;
app.listen(port,() => {
        console.log(`running on port ${port}`)
})
.on('error',function(err) {
        console.log('stopped')
})

此代码可以正常工作,我设法获取在客户端上创建的form JSON作为服务器上的请求消息。但是,我的req.body在服务器上的输出如下:

{ '----------------------------926328179431047129531240\r\nContent-Disposition: form-data; name':
   '"user"\r\n\r\nsomeuser\r\n----------------------------926328179431047129531240--\r\n' }

此输出未按我期望的那样格式化为JSON对象。 upload.none()中的参数multer是否应该将req.body解析为JSON? 有人知道我在这里出了什么问题吗?是否需要更改其他任何参数才能将req.body上的输出格式化为JSON对象?


观察:我知道,如果我使用const form = {"user":"someuser"}手动创建此JSON,我将把输出作为对象放在服务器上的req.body上。但是,我使用form-data是因为我打算在原始代码中读取客户端上带有createReadStream的大文件,并在服务器上与createWriteStream和库{{ 1}}是我发现使form-data支持数据流传输的解决方案。

ttzzhhssjjnn 回答:如何使multer正确解析随表格数据发送的客户端请求?

您看到的原因是multer 仅在content-type标头设置为multipart/form-data 时解析请求。您未设置请求标头,因此使用application/x-www-form-urlencoded发送请求,multer忽略了请求,而body-parser进行了解析。

要解决此问题,请在您的请求上设置标题,如下所示:

const FormData = require("form-data");
const axios = require("axios");

let form = new FormData();
form.append("user","someuser");
// form.append("my_buffer",Buffer.alloc(10)); // or actual image

axios({
  method: "post",url: "http://localhost:8080/data",data: form,headers: form.getHeaders()
})
  .then(function(response) {
    console.log(response.status);
  })
  .catch(function(response) {
    console.log(response.status);
  });

,
crossref
,

先前的答案之一(@Michal Levy)已经提到multer需要客户端HTML表单中的enctype =“ multipart / form-data”声明。 这是直接来自文档的示例:

<form action="/profile" method="post" enctype="multipart/form-data">
    <input type="file" name="avatar" />
</form>

接下来,您对multer.null()的问题(可能是一条语句)应该在req.body中返回JSON对象-我认为这是不正确的。

Based again on the docsmulter.null(),如果表单包含纯文本字段:

  

如果需要处理纯文本的多部分表单,则应使用.none()方法。

因此,这表明您可能无法立即获得req.body中的JSON。 此外,您登录到代码段中的输出可能来自请求对象,而不是multer本身。我将在一秒钟内解决这个问题。

这是一个片段,它将向您展示如何正确使用multer服务器端以及如何在不考虑内存存储等情况下以很高的水平记录结果。

  1. 返回您的客户端代码,并确保您使用的HTML表单带有正确的enctype,否则multer无效。

  2. 删除您的multer.null()方法,因为它并不能真正帮助您,而是仅允许您加载纯文本形式,而不是JSON预格式化输出。

  3. 改为包含以下内容:

    const multer = require("multer");
    const upload = multer().single("name_field_in_your_form"); // this is the fieldname in your form if you want to upload a single file only
    
  4. 在处理表单的模块内部,让multer处理错误,而不是将其留给express ...这样,您就在加载时捕获了错误:

    upload(req,res,function (err) {
      if (err instanceof multer.MulterError) {
        console.log("MultiError occured when uploading");
        return;
      }
    
      else if (err) {
        console.log(err);
        return;
      }
    
  5. 对字段进行字符串化处理,并从multer中间件获取所需的数据:

    const {fieldname1example,fieldname2example} = JSON.stringify( req.body ); const yourMulterFile = 要求文件;

  6. 记录yourMulterFile变量并将您感兴趣的数据转换为JSON。 如果您对文件本身感兴趣以进行进一步处理,请查看.buffer属性,该属性返回,其名称表示上传文件的缓冲区。

让我知道这是否不能解决或澄清问题。

本文链接:https://www.f2er.com/3043038.html

大家都在问