Dieser Artikel stellt hauptsächlich die allgemeine Express-Middleware-Body-Parser-Implementierungsanalyse in Nodejs vor. Er hat einen gewissen Referenzwert.
Vorab geschrieben
body-parser
ist eine sehr häufig verwendete express
Middleware, die zum Parsen des Anforderungstexts von Post-Anfrage verwendet wird. Die Verwendung ist sehr einfach. Die folgenden zwei Codezeilen decken die meisten Verwendungsszenarien ab.
app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false }));
Dieser Artikel beginnt mit einem einfachen Beispiel und untersucht die interne Implementierung von body-parser
. Informationen zur Verwendung von body-parser
können interessierte Studierende der offiziellen Dokumentation entnehmen.
Grundlagen für den Einstieg
Vor der formalen Erklärung schauen wir uns zunächst eine POST-Anfragenachricht an, wie unten gezeigt.
POST /test HTTP/1.1 Host: 127.0.0.1:3000 Content-Type: text/plain; charset=utf8 Content-Encoding: gzip chyingp
Unter diesen müssen wir auf Content-Type
, Content-Encoding
und den Nachrichtentext achten:
Content-Type: der Typ des Nachrichtentext und Codierung anfordern. Zu den gängigen Typen gehören text/plain, application/json, application/x-www-form-urlencoded. Zu den gängigen Kodierungen gehören utf8, gbk usw.
Content-Encoding: Deklariert das Komprimierungsformat des Nachrichtentexts. Zu den allgemeinen Werten gehören gzip, deflate und Identity.
Nachrichtentext: Dies ist eine gewöhnliche Text-Zeichenfolge chyingp.
Was Body-Parser hauptsächlich macht
body-parser
Die wichtigsten Punkte der Implementierung sind wie folgt:
1. Verarbeiten Sie verschiedene Arten von Anforderungstexten: z. B. Text, JSON, URL-codiert usw., und die entsprechenden Nachrichtentextformate sind unterschiedlich.
2. Behandeln Sie verschiedene Kodierungen: wie utf8, gbk usw.
3. Behandeln Sie verschiedene Komprimierungstypen: wie gzip, deflare usw.
4. Umgang mit anderen Grenzen und Ausnahmen.
1. Verarbeitung verschiedener Arten von Anforderungstexten
Um den Lesern das Testen zu erleichtern, finden Sie den vollständigen Code auf der Github des Autors.
Text/Plain analysieren
Der vom Client angeforderte Code lautet wie folgt, wobei die Standardcodierung verwendet und der Anforderungstext nicht komprimiert wird. Der Anforderungstexttyp ist 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');
Der Servercode lautet wie folgt. text/plain
Die Typverarbeitung ist relativ einfach, nämlich Pufferspleißen.
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);
Anwendung/json analysieren
Der Clientcode lautet wie folgt, ersetzen Sie Content-Type
durch 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) );
Der Servercode lautet wie folgt: Im Vergleich zu text/plain
gibt es nur einen weiteren JSON.parse()
-Prozess.
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);
Anwendung/x-www-form-urlencoded analysieren
Der Client-Code lautet wie folgt: Der Anforderungstext wird durch querystring
formatiert Holen Sie sich so etwas wie nick=chyingp
string.
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) );
Der Servercode lautet wie folgt und ähnelt dem Parsen von text/plain
, mit Ausnahme des zusätzlichen Aufrufs von 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. Umgang mit unterschiedlichen Kodierungen
Anfragen von Clients verwenden derzeit nicht unbedingt die Standardkodierung muss entschlüsselt werden. 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);
über Content-Type
ab und führen Sie dann den umgekehrten Decodierungsvorgang über gbk
durch. 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. Verarbeitung verschiedener Komprimierungsarten
Hier ist ein Beispiel für Komprimierung. Der Client-Code lautet wie folgt und die wichtigsten Punkte sind wie folgt: 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);
dekomprimiert (guzip) wird. 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);
steht auf der Rückseite. Die Kernimplementierung von
ist nicht kompliziert Code behandelt Ausnahmen mit Grenzen. body-parser
, nämlich Content-Type
. Die Verarbeitung ist relativ kompliziert und multipart/form-data
beabsichtigt nicht, dies zu unterstützen. Der Platz ist begrenzt, daher werden wir ihn in den folgenden Kapiteln weiter ausbauen. body-parser
Kostenloses Javascript-Video-Tutorial
2.Detaillierte Beispiele für die JS-Implementierung des Laufschrift-Scrollens Wirkung
3.JS-Codebeispiel für die Anzeige von QQ-Chatnachrichten und die Funktion zum Senden von Kommentaren
4. Eine einzelne Zeile von JS zur Implementierung der Überprüfung des mobilen Geldformats
5. JavaScript-Formularüberprüfungs-Implementierungscode_Javascript-Kenntnisse
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen häufig verwendeter Middleware-Body-Parser in Nodejs. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!