express解析post请求的几个中间件

178 阅读2分钟

Content-Type介绍

Content-Type : 是指 http/https 发送信息至服务器时的内容编码类型, Content-Type 用于表明发送数据流的类型,服务器根据编码类型使用特定的解析方式,获取数据流中的数据。四种常见的 POST 请求的 Content-Type 数据类型:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • application/json
  • text/xml

www-form-urlencoded

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({
    extended:true
}));
app.post('/urlencoded', (req, res) => {
    console.log(req.body);
    res.send(" post successfully!");
});
app.listen(3000);

multipart/form-data

浏览器中Content-Type的值为,浏览器会自动加上boundary

Content-Type:

multipart/form-data; boundary=----WebKitFormBoundary9c4z4oAF79YO7AZC

这种方式一般用于数据上传,三种中间件可选,connect-multiparty、formidable、multiparty

var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
app.post('/formdata',multipartMiddleware, (req, res) => {
  const file = req.files.file;
  const {fileName, fileSize} = req.body
  
  console.log(req.body);
  res.send("post successfully!");
});

上面一种方式前端代码为:

const formData = new FormData()

formData.append('file', fileObj.file)
formData.append('fileName', fileObj.fileName)
formData.append('fileSize', fileObj.size)
// npm install formidable --save
app.post('/formData1', function (req, res) {  
  var form = new formidable.IncomingForm();  
  form.uploadDir = "upload/";  
  form.parse(req, function (err, fields, files) {    
   var obj = {};    
   Object.keys(fields).forEach(function (name) { 
     obj[name] = fields[name];    
   });    
   Object.keys(files).forEach(function (name) {      
     if (files[name] && files[name].name) {        
       obj[name] = files[name];        
       fs.renameSync(files[name].path, form.uploadDir + files[name].name);     
    }    
   });   
   res.send(obj);  
  });
});

application/json

告诉服务端消息主体是序列化后的 JSON 字符串,body-parser中间件支持json解析, 添加中间件进行解析即可

app.use(bodyParser.json());

text/xml

body-parser默认不支持这种数据格式

  • 解决方法:把请求体参数按照字符串读取出来,然后使用 xml2json 包把字符串解析成json对象,然后对json对象进行操作,方便得多。
  • 注意:我们还是要使用 body-parse 得到字符串,然后再转化. 利用req上定义的事件 data 来获取http请求流, end 事件结束请求流的处理. 利用 xml2json 把上面得到的请求参数流(我们直接转化为字符串)转化为 json 对象.
var express = require('express');
var bodyParser = require('body-parser');
var xml2json=require('xml2json');
var app = express();
app.use(bodyParser.urlencoded({
  extended: true
}));
app.post('/xml', function (req, res) {
  req.rawBody = '';//添加接收变量
  var json={};
  req.setEncoding('utf8');
  req.on('data', function(chunk) { 
    req.rawBody += chunk;
  });
  req.on('end', function() {
  json=xml2json.toJson(req.rawBody);
  res.send(JSON.stringify(json));
  }); 
});
app.listen(3000);