Maison >interface Web >js tutoriel >Explication détaillée d'exemples d'analyseurs de corps middleware couramment utilisés dans Nodejs

Explication détaillée d'exemples d'analyseurs de corps middleware couramment utilisés dans Nodejs

Y2J
Y2Joriginal
2017-05-23 13:25:523096parcourir

Cet article présente principalement l'analyse commune de l'implémentation de l'analyseur de corps du middleware Express dans Nodejs. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Écrit devant

<.>

est un middleware body-parser très couramment utilisé, qui est utilisé pour analyser le corps de la requête de expressdemande de publication. C'est très simple à utiliser. Les deux lignes de code suivantes ont couvert la plupart des scénarios d'utilisation.

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
Cet article part d'un exemple simple et explore la mise en œuvre interne de

. Quant à l'utilisation de body-parser, les étudiants intéressés peuvent se référer à la documentation officielle. body-parser

Bases pour démarrer

Avant l'explication formelle, examinons d'abord un message de requête POST, comme indiqué ci-dessous.

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

chyingp
Parmi eux, nous devons faire attention à

, Content-Type et au corps du message : Content-Encoding

  1. Content-Type : le type du corps du message de la demande, codage. Les types courants incluent text/plain, application/json, application/x-www-

    form-urlencoded. Les encodages courants incluent utf8, gbk, etc.

  2. Content-Encoding : Déclare le format de compression du corps du message. Les valeurs courantes incluent gzip, deflate et Identity.

  3. Corps du message : Il s'agit d'un texte ordinaire

    chaîne chyingp.

Ce que fait principalement body-parser

Les points clés de la mise en œuvre sont les suivants : body-parser

1. Traitez différents types de corps de requête : tels que texte, json, urlencoded, etc., et les formats de corps de message correspondants sont différents.


2. Gérez différents encodages : tels que utf8, gbk, etc.


3. Gérez différents types de compression : tels que gzip, deflare, etc.


4. Gestion des autres limites et exceptions.

1. Traitement de différents types de corps de requête

Afin de faciliter les tests des lecteurs, les exemples suivants incluent le code serveur et client. Le code complet peut être trouvé sur. le github de l'auteur.

Analyser le texte/plain

Le code demandé par le client est le suivant, en utilisant l'encodage par défaut et sans compresser le corps de la requête. Le type de corps de la requête est

. text/plain

var http = require(&#39;http&#39;);

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

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

client.end(&#39;chyingp&#39;);
Le code du serveur est le suivant.

Le traitement des types est relativement simple, il s'agit de l'épissage de tampon. text/plain

var http = require(&#39;http&#39;);

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

  req.on(&#39;data&#39;, buff => {
    arr.push(buff);
  });

  req.on(&#39;end&#39;, () => {
    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);

Parse application/json

Le code client est le suivant, remplacez

par Content-Type. application/json

var http = require(&#39;http&#39;);
var querystring = require(&#39;querystring&#39;);

var options = {
  hostname: &#39;127.0.0.1&#39;,
  port: &#39;3000&#39;,
  path: &#39;/test&#39;,
  method: &#39;POST&#39;,
  headers: {
    &#39;Content-Type&#39;: &#39;application/json&#39;,
    &#39;Content-Encoding&#39;: &#39;identity&#39;
  }
};

var jsonBody = {
  nick: &#39;chyingp&#39;
};

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

client.end( JSON.stringify(jsonBody) );
Le code du serveur est le suivant Par rapport à

, il n'a qu'un processus text/plain supplémentaire. JSON.parse()

var http = require(&#39;http&#39;);

var parsePostBody = function (req, done) {
  var length = req.headers[&#39;content-length&#39;] - 0;
  var arr = [];
  var chunks;

  req.on(&#39;data&#39;, buff => {
    arr.push(buff);
  });

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

var server = http.createServer(function (req, res) {
  parsePostBody(req, (chunks) => {
    var json = JSON.parse( chunks.toString() );  // 关键代码  
    res.end(`Your nick is ${json.nick}`)
  });
});

server.listen(3000);

Parse application/x-www-form-urlencoded

Le code client est le suivant Ici, le corps de la requête est formaté via

pour. obtenez quelque chose comme querystring chaîne. nick=chyingp

var http = require(&#39;http&#39;);
var querystring = require(&#39;querystring&#39;);

var options = {
  hostname: &#39;127.0.0.1&#39;,
  port: &#39;3000&#39;,
  path: &#39;/test&#39;,
  method: &#39;POST&#39;,
  headers: {
    &#39;Content-Type&#39;: &#39;form/x-www-form-urlencoded&#39;,
    &#39;Content-Encoding&#39;: &#39;identity&#39;
  }
};

var postBody = { nick: &#39;chyingp&#39; };

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

client.end( querystring.stringify(postBody) );
Le code du serveur est le suivant, qui est similaire à l'analyse de

, à l'exception de l'appel supplémentaire de text/plain. querystring.parse()

var http = require(&#39;http&#39;);
var querystring = require(&#39;querystring&#39;);

var parsePostBody = function (req, done) {
  var length = req.headers[&#39;content-length&#39;] - 0;
  var arr = [];
  var chunks;

  req.on(&#39;data&#39;, buff => {
    arr.push(buff);
  });

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

var server = http.createServer(function (req, res) {
  parsePostBody(req, (chunks) => {
    var body = querystring.parse( chunks.toString() ); // 关键代码
    res.end(`Your nick is ${body.nick}`)
  });
});

server.listen(3000);

2. Gestion des différents encodages

Souvent, les demandes des clients n'utilisent pas nécessairement l'encodage

par défaut pour le moment. doit être décodé. utf8

La demande du client est la suivante, avec deux points principaux.


1. Instruction d'encodage : Add;charset=gbk à la fin de Content-Type


2. Encodage du corps de la requête : iconv-lite est utilisé ici pour encoder le. corps de la requête Encoder iconv.encode('Programmer Xiaoka', encoding)

var http = require(&#39;http&#39;);
var iconv = require(&#39;iconv-lite&#39;);

var encoding = &#39;gbk&#39;; // 请求编码

var options = {
  hostname: &#39;127.0.0.1&#39;,
  port: &#39;3000&#39;,
  path: &#39;/test&#39;,
  method: &#39;POST&#39;,
  headers: {
    &#39;Content-Type&#39;: &#39;text/plain; charset=&#39; + encoding,
    &#39;Content-Encoding&#39;: &#39;identity&#39;,    
  }
};

// 备注:nodejs本身不支持gbk编码,所以请求发送前,需要先进行编码
var buff = iconv.encode(&#39;程序猿小卡&#39;, encoding);

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

client.end(buff, encoding);
Le code du serveur est le suivant Il y a deux étapes supplémentaires ici : le jugement d'encodage et l'opération de décodage. Obtenez d'abord le type d'encodage

via Content-Type, puis effectuez l'opération de décodage inverse via gbk. iconv-lite

var http = require(&#39;http&#39;);
var contentType = require(&#39;content-type&#39;);
var iconv = require(&#39;iconv-lite&#39;);

var parsePostBody = function (req, done) {
  var obj = contentType.parse(req.headers[&#39;content-type&#39;]);
  var charset = obj.parameters.charset; // 编码判断:这里获取到的值是 &#39;gbk&#39;

  var arr = [];
  var chunks;

  req.on(&#39;data&#39;, buff => {
    arr.push(buff);
  });

  req.on(&#39;end&#39;, () => {
    chunks = Buffer.concat(arr);
    var body = iconv.decode(chunks, charset); // 解码操作
    done(body);
  });
};

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

server.listen(3000);

3. Traitement des différents types de compression

Voici un exemple de

compression. Le code client est le suivant, et les points clés sont les suivants : gzip

1. Déclaration du type de compression : Content-Encoding se voit attribuer gzip.


2. Compression du corps de la requête : gzip compresse le corps de la requête via le module zlib.

var http = require(&#39;http&#39;);
var zlib = require(&#39;zlib&#39;);

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

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

// 注意:将 Content-Encoding 设置为 gzip 的同时,发送给服务端的数据也应该先进行gzip
var buff = zlib.gzipSync(&#39;chyingp&#39;);

client.end(buff);
Le code du serveur est le suivant, où le corps de la requête est décompressé (guzip) via le module

. zlib

var http = require(&#39;http&#39;);
var zlib = require(&#39;zlib&#39;);

var parsePostBody = function (req, done) {
  var length = req.headers[&#39;content-length&#39;] - 0;
  var contentEncoding = req.headers[&#39;content-encoding&#39;];
  var stream = req;

  // 关键代码如下
  if(contentEncoding === &#39;gzip&#39;) {
    stream = zlib.createGunzip();
    req.pipe(stream);
  }

  var arr = [];
  var chunks;

  stream.on(&#39;data&#39;, buff => {
    arr.push(buff);
  });

  stream.on(&#39;end&#39;, () => {
    chunks = Buffer.concat(arr);    
    done(chunks);
  });

  stream.on(&#39;error&#39;, error => console.error(error.message));
};

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

server.listen(3000);

est écrit à l'arrière. L'implémentation de base de

n'est pas compliquée. Après avoir regardé le code source, vous constaterez que plus. le code gère les exceptions. body-parser

De plus, pour les requêtes POST, il existe un autre

très courant qui est Content-Type Le traitement de celle-ci est relativement compliqué, et multipart/form-data ne prévoit pas de le prendre en charge. L'espace est limité, nous continuerons donc à développer dans les chapitres suivants. body-parser

[Recommandations associées]

1.

Tutoriel vidéo gratuit Javascript

2.

Exemples détaillés d'implémentation JS du défilement de sélection effet

3.

Exemple de code JS pour l'affichage des messages de chat QQ et la fonction de soumission de commentaires

4. Une seule ligne de JS pour implémenter la vérification du format d'argent mobile

5 Compétences de mise en œuvre du code_javascript de la vérification des formulaires JavaScript

.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn