Heim > Web-Frontend > js-Tutorial > Detaillierte Erläuterung von Beispielen häufig verwendeter Middleware-Body-Parser in Nodejs

Detaillierte Erläuterung von Beispielen häufig verwendeter Middleware-Body-Parser in Nodejs

Y2J
Freigeben: 2017-05-23 13:25:52
Original
3091 Leute haben es durchsucht

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 }));
Nach dem Login kopieren

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
Nach dem Login kopieren

Unter diesen müssen wir auf Content-Type, Content-Encoding und den Nachrichtentext achten:

  1. 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.

  2. Content-Encoding: Deklariert das Komprimierungsformat des Nachrichtentexts. Zu den allgemeinen Werten gehören gzip, deflate und Identity.

  3. Nachrichtentext: Dies ist eine gewöhnliche Text-Zeichenfolge chyingp.

Was Body-Parser hauptsächlich macht

body-parserDie 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');
Nach dem Login kopieren

Der Servercode lautet wie folgt. text/plainDie 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);
Nach dem Login kopieren

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) );
Nach dem Login kopieren

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);
Nach dem Login kopieren

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) );
Nach dem Login kopieren

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);
Nach dem Login kopieren

2. Umgang mit unterschiedlichen Kodierungen

Anfragen von Clients verwenden derzeit nicht unbedingt die Standardkodierung muss entschlüsselt werden. utf8

Die Kundenanfrage lautet wie folgt mit zwei Hauptpunkten.


1. Codierungsanweisung: Fügen Sie;charset=gbk am Ende von Content-Type hinzu


2. Request-Body-Codierung: iconv-lite wird hier zum Codieren verwendet Anfragetext Kodieren iconv.encode('Programmer Xiaoka', Kodierung)

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);
Nach dem Login kopieren
Der Servercode lautet wie folgt: Kodierungsbeurteilung und Dekodierungsvorgang. Rufen Sie zuerst den Codierungstyp

ü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);
Nach dem Login kopieren

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

1. Komprimierungstypdeklaration: Content-Encoding wird gzip zugewiesen.


2. Komprimierung des Anforderungshauptteils: gzip komprimiert den Anforderungshauptteil über das zlib-Modul.

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);
Nach dem Login kopieren
Der Servercode lautet wie folgt, wobei der Anforderungstext über das Modul

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);
Nach dem Login kopieren

steht auf der Rückseite. Die Kernimplementierung von

ist nicht kompliziert Code behandelt Ausnahmen mit Grenzen. body-parser

Darüber hinaus gibt es bei POST-Anfragen noch einen weiteren sehr häufigen

, 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

[Verwandte Empfehlungen]

1.

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage