javascript - Body-Parser 不读取请求正文

标签 javascript node.js axios body-parser

当我通过 axios 发送类似 FormData 的请求时,body-parser 不读取参数。但是当我发送像 json 这样的请求时,它会读取。我使用表单数据,因为我发送了 imageFile,所以我必须使用 FormData。

另外我用的是express-validator,它总是报错,因为它无法读取参数。顺便说一句,我不尝试使用 body-parser 解析图像。我用多。我的问题是 body-parser 无法读取除图像之外的参数。

HTML 部分:

let formData = new FormData();
formData.append("email", "1@gmail.com");
formData.append("name", "1");
formData.append("password", "12345678901");
let imagefile = document.querySelector('#uploadImg');
formData.append("myFile", imagefile.files[0])
let url = "http://localhost:8080/;
axios({url: url,
       data: formData,
       method: "Post",
       headers: {
            'accept': 'application/json',
            'Accept-Language': 'en-US,en;q=0.8',
            'Content-Type': `multipart/form-data`,
        }
    }).then(x => {
      console.log(x);
    })

Node.js 部分:

const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const app = express();
const { check, validationResult } = require("express-validator");
app.use(cors());

app.use(bodyParser.json());
app.use(
  bodyParser.urlencoded({
    extended: true
  })
);
app.use(bodyParser.text({ type: "text/html" }));

app.post(
  "/sa",
  [
    check("email", "Email Hatalı").isEmail(),
    check("name", "Name Hatalı").isLength({ min: 5 }),
    check("password", "Password Hatalı").isLength({ min: 10 })
  ],
  (req, res, next) => {
    console.log(req.body);
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      console.log(errors.mapped());
      return res.status(422).json({ errors: errors.array() });
    }
    res.send(200);
  }
);

Express-Validator 错误输出:

{ email:
   { value: undefined,
     msg: 'Email Hatalı',
     param: 'email',
     location: 'body' },
  name:
   { value: undefined,
     msg: 'Name Hatalı',
     param: 'name',
     location: 'body' },
  password:
   { value: undefined,
     msg: 'Password Hatalı',
     param: 'password',
     location: 'body' } }

我这里只有一个问题。主体解析器不解析请求和验证读取空参数。

最佳答案

您正在使用 FormData(mime 类型 multipart/form-data),body-parser 不支持:

This does not handle multipart bodies, due to their complex and typically large nature. For multipart bodies, you may be interested in the following modules:

文档中的措辞可能有点困惑,因为大多数开发人员没有意识到表单数据是作为 multipart 传输的。

你有两个选择:

  1. 使用另一个模块来解析表单数据。我个人使用过 formidable,但是 body-parser 有一个可以工作的模块建议列表。

  2. 将您的请求作为 URL 编码而不是表单数据发送:

    let urlData = "";
    urlData += "email=1@gmail.com&";
    urlData += "name=1&";
    urlData += "password=12345678901&";
    urlData += "myFile" + // well.. this is problematic
    

如果您要使用 URL 编码数据,则需要将图像数据转换为字符串。您可以使用 base64 编码来做到这一点。在前端,您可以在 canvas 中绘制图像,然后使用 canvas API 获取数据 url。

然后在服务器上您必须将数据 url 转换回二进制缓冲区,但这很简单。

关于javascript - Body-Parser 不读取请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57670772/

相关文章:

更改段落文本的 Javascript 事件监听器单击按钮不起作用?

node.js - 使用 Mongoose 自动增量

javascript - 避免请求对象上的空字符串值

javascript - Axios:不进入错误的 catch 方法

javascript - JavaScript 的执行是否会延迟到 CSSOM 构建完成?

javascript - 在javascript中覆盖css类

javascript - 为什么 style.display 设置为 'block' 时会改变我的 div 的大小?

javascript - 如何使用 yazl 压缩缓冲区?

mysql - 如何在nw.js中安装node mysql模块?

javascript - 如何在 React js 中使用 axios 将一个或多个文件发送到 API?