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 express
demande 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 }));
. 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
, Content-Type
et au corps du message : Content-Encoding
form-urlencoded. Les encodages courants incluent utf8, gbk, etc.
chaîne chyingp.
Ce que fait principalement body-parser
Les points clés de la mise en œuvre sont les suivants : body-parser
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('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');
Le traitement des types est relativement simple, il s'agit de l'épissage de tampon. text/plain
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);
Parse application/json
Le code client est le suivant, remplacez par Content-Type
. application/json
var http = require('http'); var querystring = require('querystring'); var options = { hostname: '127.0.0.1', port: '3000', path: '/test', method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Encoding': 'identity' } }; var jsonBody = { nick: 'chyingp' }; var client = http.request(options, (res) => { res.pipe(process.stdout); }); client.end( JSON.stringify(jsonBody) );
, il n'a qu'un processus text/plain
supplémentaire. JSON.parse()
var http = require('http'); var parsePostBody = function (req, done) { var length = req.headers['content-length'] - 0; 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 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('http'); var querystring = require('querystring'); var options = { hostname: '127.0.0.1', port: '3000', path: '/test', method: 'POST', headers: { 'Content-Type': 'form/x-www-form-urlencoded', 'Content-Encoding': 'identity' } }; var postBody = { nick: 'chyingp' }; var client = http.request(options, (res) => { res.pipe(process.stdout); }); client.end( querystring.stringify(postBody) );
, à l'exception de l'appel supplémentaire de text/plain
. querystring.parse()
var http = require('http'); var querystring = require('querystring'); var parsePostBody = function (req, done) { var length = req.headers['content-length'] - 0; 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 = 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
var http = require('http'); var iconv = require('iconv-lite'); var encoding = 'gbk'; // 请求编码 var options = { hostname: '127.0.0.1', port: '3000', path: '/test', method: 'POST', headers: { 'Content-Type': 'text/plain; charset=' + encoding, 'Content-Encoding': 'identity', } }; // 备注:nodejs本身不支持gbk编码,所以请求发送前,需要先进行编码 var buff = iconv.encode('程序猿小卡', encoding); var client = http.request(options, (res) => { res.pipe(process.stdout); }); client.end(buff, encoding);
via Content-Type
, puis effectuez l'opération de décodage inverse via gbk
. iconv-lite
var http = require('http'); var contentType = require('content-type'); var iconv = require('iconv-lite'); var parsePostBody = function (req, done) { var obj = contentType.parse(req.headers['content-type']); var charset = obj.parameters.charset; // 编码判断:这里获取到的值是 'gbk' var arr = []; var chunks; req.on('data', buff => { arr.push(buff); }); req.on('end', () => { 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
var http = require('http'); var zlib = require('zlib'); var options = { hostname: '127.0.0.1', port: '3000', path: '/test', method: 'POST', headers: { 'Content-Type': 'text/plain', 'Content-Encoding': 'gzip' } }; var client = http.request(options, (res) => { res.pipe(process.stdout); }); // 注意:将 Content-Encoding 设置为 gzip 的同时,发送给服务端的数据也应该先进行gzip var buff = zlib.gzipSync('chyingp'); client.end(buff);
. zlib
var http = require('http'); var zlib = require('zlib'); var parsePostBody = function (req, done) { var length = req.headers['content-length'] - 0; var contentEncoding = req.headers['content-encoding']; var stream = req; // 关键代码如下 if(contentEncoding === 'gzip') { stream = zlib.createGunzip(); req.pipe(stream); } var arr = []; var chunks; stream.on('data', buff => { arr.push(buff); }); stream.on('end', () => { chunks = Buffer.concat(arr); done(chunks); }); stream.on('error', 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
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
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!