当我通过axios发送类似FormData的请求时,body-parser不会读取参数。但是当我发送json之类的请求时,它会读取。我使用表格数据是因为我发送了imageFile,所以我必须使用FormData。
我也使用express-validator,它始终会给出错误,因为它无法读取参数。顺便说一句,我不尝试使用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' } }
我这里只有一个问题。正文解析器不解析请求,验证未读取空参数。
答案 0 :(得分:1)
您正在使用FormData
不支持的multipart/form-data
(哑剧类型body-parser
):
由于其复杂且通常较大的性质,因此无法处理多部分实体。对于多部分实体,您可能对以下模块感兴趣:
文档中的措辞可能会有些混乱,因为大多数开发人员并未意识到表单数据是以multipart
的形式传输的。
您有两种选择:
使用另一个模块来解析表单数据。我个人使用过formidable
,但是body-parser
列出了可以使用的模块的建议。
使用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转换回二进制缓冲区,但这很简单。
答案 1 :(得分:0)
要解决未定义的错误(来自express-validator),您的require语句应按顺序排列,请您按此顺序尝试吗?
此require语句必须在正文解析器行之后,因此请在
之后添加const { check, validationResult } = require("express-validator");
之后
app.use(bodyParser.text({ type: "text/html" }));
答案 2 :(得分:0)
您必须在快速验证器之前使用multer
var upload = multer({ dest: 'uploads/' }) // or whatever you config
app.post(
"/sa", upload(xx), [ your validations ], ( req , res ....