app.use
1.ミドルウェアとは
ミドルウェアは、要求から応答までのユーザーのプロセス全体を処理のために複数のミドルウェアに分散する要求処理方法です。これは、コードの柔軟性を向上させ、動的に拡張できるようにすることを目的としています。簡単な理解は次のとおりです。受信したリクエストをレイヤーごとにフィルタリングします。
2.エクスプレスのミドルウェア
リクエスト処理のプロセスは次のとおりです。サーバーがリクエストを受信した後、サーバーが複数のミドルウェアを書き込む場合、要件を満たすミドルウェアが一致するまで順番に照合され、処理されます。同じリクエストを介したミドルウェアは、同じリクエストオブジェクトとレスポンスオブジェクトであることに注意してください。
ミドルウェアの分類:
-
アプリケーションレベルのミドルウェア
-
完全一致(要求パスと要求方法は関係ありません。ユーザーが要求すると、ミドルウェアに配布されると、要求操作が直接処理されます)
app.use(function (req,res,next) { console.log('全匹配'); next(); })
要求がこのミドルウェアを通過するとき、要求のパスとメソッドを気にせず、処理のためにミドルウェアに直接入ります。その中に
next
は、次に適格なミドルウェアを呼び出すメソッドがあります。記述しない場合next
、現在のミドルウェアに残り、他のミドルウェアと一致しません。 -
パス
/xx/
が始まる場所と一致します(あいまい一致)app.use('/a',function (req,res,next) { console.log(3333); })
/a/
正常に照合および処理できるのは、で始まるパスのみです。たとえば、/a/b
正常に照合できますが、正常に照合/ab/b
できません。
-
-
ルーティングレベルのミドルウェア(完全一致)
正常に一致させるには、リクエストパスとリクエストメソッドと一致している必要があります
app.get('/a',(req,res) => { console.log(1111); res.send('index.html'); })
次の使用:
- パラメータなし
次のシナリオを確認してください。
app.use(function (req,res,next) {
console.log('全匹配');
next();
})
app.use('/a',function (req,res,next) {
console.log(3333);
next();
})
app.get('/a',(req,res) => {
console.log(1111);
res.render('index.html');
})
app.get('/',(req,res) => {
console.log('2222');
res.render('index.html',{
name: 'chen'
})
})
app.get('/',(req,res) => {
console.log('44444');
})
ブラウザはURLを入力し127.0.0.1:3000/
、各ミドルウェアを順番にトラバースし、最初に完全に一致したミドルウェアと一致します。印刷後、と全匹配
呼ばれnext
、要件を満たすミドルウェアとの一致を継続しますが、2番目の完全に一致するミドルウェアは満たされません。 。/a/
直接通過で始まるパスへ、3番目の一致が続行されます。これは完全一致であるため、まだ一致していません。最後のミドルウェアに直面した場合、一致は成功2222
しnext
、条件が常に探しているブラウザはオブジェクトを要求します。つまり、127.0.0.1:3000/
この要求に準拠する必要があります。
ここに別のシーンがあります:
app.get('/a',(req,res,next) => {
console.log(1111);
next();
})
app.get('/a',(req,res) => {
res.send('ok');
})
アクセスされる/a
と、最初のミドルウェアの出力と一致し、それ1111
に遭遇しnext
、2番目のミドルウェアと一致して、クライアントに戻りますok
。ミドルウェアと一致する要求は、後者がカバーするのではなく、1つずつ一致するプロセスであることがわかります。前者のプロセス。
-
パラメータ付き
app.use(function (req,res,next) { console.log('全匹配'); let err = '出错了'; next(err); }) app.use('/a',function (req,res,next) { console.log(3333); next(); }) # 带有四个参数,且这四个参数必须写全 app.use(function (err,req,res,next) { console.log(err);// 出错了 })
/a
パスにアクセスするときに、最初のミドルウェアが一致し、次が検出され、パラメーターがある場合、他のミドルウェアとは一致せず、一致する4つのパラメーターを持つミドルウェアに直接移動します。これは、エラー応答の統合処理に使用できます。
サードパーティのプラグインを使用する原則:
同じリクエストが通過するミドルウェアは同じリクエストオブジェクトとレスポンスオブジェクトであるため、ミドルウェアがリクエストオブジェクトに他のコンテンツを追加すると、正常に一致した他のミドルウェアがこの新しいコンテンツにアクセスできます。
# 访问'/'
app.use(function (req,res,next) {
console.log(111);
req.body = {
name: 'chen'
}
next()
})
app.use('/',function (req,res,next) {
console.log(req.body.name);// chen
})
上記のコードは、最初のミドルウェアが一致すると、body属性がリクエストオブジェクトに追加され、2番目に一致するミドルウェアが呼び出されると、新しい属性コンテンツにアクセスできることを示しています。サードパーティのプラグインはこのように、リクエストオブジェクトを変更し、対応するコンテンツを返します。他のミドルウェアにアクセスするときは、次のようなサードパーティのプラグインの新しいコンテンツにアクセスできます。body-parser
プラグイン
# 假设已经下载好了body-parser插件
# 引入包
const bodyParser = require('body-parser');
# 将body-parser函数作为参数传递到app.use中
app.use(bodyParser.urlencoded({
extended: false}));
app.use(bodyParser.json());
app.get('/',(req,res)=> {
console.log(req.body);
})
bodyParserが関数としてミドルウェアに渡されると、この時点でbody属性をリクエストオブジェクトに追加するなどの操作が実行されます。追加が完了したら、それを呼び出してnext
、次のミドルウェアとの照合を続行する必要があります。今回は、完全に一致するミドルウェアに含めることができます。body属性を使用してください。
上記の一連の使用プロセスから、ミドルウェアの書き込み順序が依然として要求応答に影響を与えることがわかります。
3.まとめ
ミドルウェアはリクエストをフィルタリングする手段として使用されます。その中で、Expressのミドルウェアは主にnextに依存して複数のミドルウェアを接続します。同時に、同じリクエストを介したミドルウェアは同じリクエストオブジェクトとレスポンスオブジェクトであるため、より多くのミドルウェアを作成します。 2つのミドルウェア間で通信を行うことができます。
実用的なアプリケーション:
- ミドルウェアを使用して、要件に従ってプラグインを構成します
- 統合リクエストをフィルタリングした後、リクエストを処理します
- エラー応答に対して統合処理操作を実行できます