nodejs之express的中间件body-parser

拓拔辰钊
2023-12-01

body-parser一般用来对req.body进行解析;

中间件:https://github.com/expressjs/body-parser

body-parser解析https://www.cnblogs.com/chyingp/p/nodejs-learning-express-body-parser.html

http://blog.csdn.net/yanyang1116/article/details/54847560

POST请求的报文,如下所示。

POST /test HTTP/1.1
Host: 127.0.0.1:3000
Content-Type: text/plain; charset=utf8
Content-Encoding: gzip

chyingp

其中需要我们注意的有Content-TypeContent-Encoding以及报文主体:

  • Content-Type:请求报文主体的类型、编码。常见的类型有text/plainapplication/jsonapplication/x-www-form-urlencoded。常见的编码有utf8gbk等。

  • Content-Encoding:声明报文主体的压缩格式,常见的取值有gzipdeflateidentity

  • 报文主体:这里是个普通的文本字符串chyingp

body-parser主要做了什么

body-parser实现的要点如下:

  1. 处理不同类型的请求体:比如textjsonurlencoded等,对应的报文主体的格式不同。

  2. 处理不同的编码:比如utf8gbk等。

  3. 处理不同的压缩类型:比如gzipdeflare等。

  4. 其他边界、异常的处理。

一、处理不同类型请求体

为了方便读者测试,以下例子均包含服务端、客户端代码,完整代码可在笔者github上找到。

解析text/plain

客户端请求的代码如下,采用默认编码,不对请求体进行压缩。请求体类型为text/plain

var http = require('http');

var options = {
    hostname: '127.0.0.1',
    port: '3000',
    path: '/test',
    method: 'POST',
    headers: {
        'Content-Type': 'text/plain',
        'Content-Encoding': 'identity'
    }
};

var client = http.request(options, (res) => {
    res.pipe(process.stdout);
});

client.end('chyingp');

服务端代码如下。text/plain类型处理比较简单,就是buffer的拼接。

var http = require('http');

var parsePostBody = function (req, done) {
    var arr = [];
    var chunks;

    req.on('data', buff => {
        arr.push(buff);
    });

    req.on('end', () => {
        chunks = Buffer.concat(arr);
        done(chunks);
    });
};

var server = http.createServer(function (req, res) {
    parsePostBody(req, (chunks) => {
        var body = chunks.toString();
        res.end(`Your nick is ${body}`)
    });
});

server.listen(3000);

下面四个处理方法分别对body的内容采用不同的处理方法;分别是处理json数据、Buffer流数据、文本数据、UTF-8的编码的数据。

bodyParser.json(options)、bodyParser.raw(options)、bodyParser.text(options)、bodyParser.urlencoded(options)

载入模块:npm install body-parser

各个parser会对req headers及post参数进行一系列的判断和处理,只有满足条件的情况下才对post参数进行解析,解析之前,首先使用raw-body模块对req进行处理,其处理过程是将req作为一个readable stream进行处理,从而得到raw body内容,然后按具体的格式进行解析。

在express项目中,通常顺序调用body-parser所提供的parser,这样当一个parser无法满足post参数解析条件时,还可以使用另一个parser进行解析(在某些特殊的请求中,有可能所有parser均无法解析)

特定路由下的中间件用法:这种用法是针对特定路由下的特定请求的,只有请求该路由时,中间件才会拦截和解析该请求;也即这种用法是局部的;也是最常用的一个方式
var router = function(app){
  // Express 提供了内置的中间件 express.static 来设置静态文件如:图片, CSS, JavaScript 等。
   // 你可以使用 express.static 中间件来设置静态文件路径。例如,如果你将图片, CSS, JavaScript 文件放在 public 目录下,你可以这么写:
   // app.use(express.static('public'));


   var bodyParser = require('body-parser');//解释参考http://blog.csdn.net/yanyang1116/article/details/54847560


 // 创建 application/x-www-form-urlencoded 编码解析
 var jsonParser = bodyParser.json();
var urlencodedParser = bodyParser.urlencoded({ extended: false });
// app.use(jsonParser);
 app.get('/one', function (req, res) {
  res.sendFile( "/Users/wofu/Desktop/node/views" + "/" + "one.html" );
 })

 app.post('/two', urlencodedParser, function (req, res) {//第二个参数是用一种解析方式解析

  // 输出 JSON 格式
  var response = {
      "first_name":req.body.first_name,
      "last_name":req.body.last_name
  };
  console.log(response);
  console.log(req.body);
  res.end();
 })

};

exports.router = router;


 类似资料: