Express中間部品のbody-parserの原理分析
原文を読む
前言
body-parserの基本使用
中間部品の原理を分析したいのですが、まず使用から着手し、用法を十分に理解した上で分析し、今は簡単な
npm install express body-parser
body-parserコードを使うと以下の通りです.
body-parserの実現
1、原理分析
上の使用例から私達はいくつかの点を分析できます.まず、 に次いで、 最後に、 2、urlencoded、json公共ロジックを分析する
実現する前に、まず二つの方法を分析してみます.まず、要求体の内容を読み取る必要があります.データ伝送のタイプはバッファerです.文字列に変換した後、提出方法によって、要求体の内容は照会文字列または
解析に失敗した場合は、エラー処理が必要であり、
使用する変換データの方法は、一意の違いであり、両者を区別することができるのは、要求ヘッダ
3、モジュールの作成
私達は以下に自分の
npm install qs
4、acceptPostの実現
締め括りをつける
上記の解析
前言
Express
はNodeJSプラットフォームのWebフレームワークに基づいており、広く応用されており、Express
コミュニティには多くの開発者がExpress
ミドルウェアの特性を通して、様々な機能のミドルウェアを開発し、いくつかの応答を処理し、要求対象req
、応答オブジェクトres
に属性または方法を追加している.次に、よく使われるbody-parser
ミドルウェアの原理を分析して、Express
ミドルウェアの開発方法を調べます.もっと知りたいなら、Express
の内部パッケージの原理は「Expressソース分析と簡易パッケージ」を見られます.body-parserの基本使用
中間部品の原理を分析したいのですが、まず使用から着手し、用法を十分に理解した上で分析し、今は簡単な
Express
サービスを構築し、body-parser
中間部品を使用して、使用前にインストールしなければなりません.npm install express body-parser
body-parserコードを使うと以下の通りです.
const express = require("express");
const bodyParser = require("body-parser");
//
const app = express();
// body-parser
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
//
app.post("/login", function (req, res) {
console.log(req.body);
res.send(req.body);
});
//
app.listen(3000, function () {
console.log("server start 3000");
});
上記のサーバを起動し、postman
ツールによりそれぞれフォーム提出とjson
のフォーマットでアクセスする.http://localhost:3000/loginサーバ制御バックグラウンドの印刷結果とpostman
の返却結果を確認する.body-parserの実現
1、原理分析
上の使用例から私達はいくつかの点を分析できます.
body-parser
のミドルウェアの役割は、req
に属性body
を追加し、値を対象として、要求体のパラメータをキーペアの形で記憶することである.body-parser
は、POST
からの要求のみを処理する.body-parser
モジュールは、フォーム提出およびurlencoded
フォーマットの要求体パラメータをそれぞれ処理する2つの方法json
およびjson
があるオブジェクトを導出する.実現する前に、まず二つの方法を分析してみます.まず、要求体の内容を読み取る必要があります.データ伝送のタイプはバッファerです.文字列に変換した後、提出方法によって、要求体の内容は照会文字列または
json
文字列の違いが生じます.解析に失敗した場合は、エラー処理が必要であり、
POST
の要求でない場合は、他のミドルウェアを下方に実行する必要があり、最もコアなことは、要求体のデータをオブジェクトに変換してreq.body
にかけることである.使用する変換データの方法は、一意の違いであり、両者を区別することができるのは、要求ヘッダ
Content-Type
の値であるので、すべての共通論理を抽出して、一つのacceptPost
関数で実行することができる.3、モジュールの作成
私達は以下に自分の
body-parser
モジュールを作って、命名衝突を防止します.私達のモジュールはmy-body-parser
と名づけました.処理パラメータはquerystring
とqs
の二つのモジュールを使用する必要があります.npm install qs
qs
とqs
は、基本的に同じ役割を果たしています.クエリー文字列フォーマットのパラメータを処理していますが、ちょっとした違いがあります.querystring
は1つのレベルしか処理できません.querystring
は複数のレベルを処理できます.const querystring = require("querystring");
const qs = require("qs");
// urlencoded json
function acceptPost() {
// ...
}
//
function urlencoded() {
// ...
}
// json
function json() {
// ...
}
//
module.exports = { urlencoded, json };
基本モジュールを構築した後、qs
モジュール内の共通論理関数body-parser
を実装します.4、acceptPostの実現
acceptPost
方法とurlencoded
方法を両立させるために、二つのパラメータを設計した.一つは、現在の起動方法を区別するjson
であり、一つはtype
方法に対するurlencoded
である.// acceptPost
// urlencoded json
function acceptPost(type, options) {
//
return function (req, res, next) {
//
let contentType = req.headers["content-type"];
//
if (
contentType === "application/x-www-form-urlencoded" ||
contentType === "application/json"
) {
//
let buffers = [];
req.on("data", function (data) {
//
buffers.push(data);
});
req.on("end", function () {
//
let result = Buffer.concat(buffers).toString();
// req.body
// querystring qs, JSON.parse
if (type === "form") {
// extended true qs, querystring
req.body = options.extended ? qs.parse(result) : querystring.parse(result);
} else if(type === "json") {
req.body = JSON.parse(result);
}
next(); //
});
//
req.on("err", function (err) {
next(err);
});
} else {
next();
}
}
}
5、urlencodedとjson方法の実現//
function urlencoded(options) {
// type
let type = "form";
return acceptPost(type, options)
}
// json
function json() {
// type
let type = "json";
return acceptPost(type);
}
すべての共通論理を抽出した後、options
及びurlencoded
の方法の内部では、異なるタイプを定義するだけで中間論理を実行することができることがわかった.締め括りをつける
上記の解析
json
ミドルウェアの原理は、body-parse
ミドルウェア開発のモードを理解することを目的としています.ここでまとめてみると、Express
ミドルウェアは、関数であり、Express
、req
、res
、next
を返します.next
に内蔵されているエラー処理ミドルウェアに引き渡され、ミドルウェア内部コードが非同期動作に関連する場合、非同期完了のコール中にnext
を呼び出す必要があり、これはExpress
に及ばない便利な点であると同時に、両者の違いでもある.