ホームページ  >  記事  >  ウェブフロントエンド  >  Express.js ミドルウェアの紹介 (例付き)

Express.js ミドルウェアの紹介 (例付き)

不言
不言転載
2019-03-19 10:38:191722ブラウズ

この記事では、express.js ミドルウェアの概要 (例を示します) を紹介します。これは一定の参考価値があります。必要な友人は参照できます。お役に立てば幸いです。

新しい Express 開発者は、ルート ハンドラーとミドルウェアの違いについて混乱することがよくあります。そのため、app.use()、app.all()、app.get()、app.post()、app.delete()、および app.put() メソッドの違いについても混乱しています。

この記事では、ミドルウェアとルートハンドラーの違いについて説明します。また、app.use()、app.all()、app.get()、app.post()、app.delete()、および app.put() メソッドを正しく使用する方法。

ルート処理

app.use()、app.all()、app.get()、app.post()、app.delete()、および app.put() すべてルートを定義するために使用されます。これらのメソッドはルートを定義するために使用されます。ルーティングは、HTTP リクエストを処理するために使用されます。ルートはパスとコールバックの組み合わせであり、要求されたパスが一致した場合に実行されます。コールバックはルート ハンドラーと呼ばれます。

これらの違いは、さまざまなタイプの HTTP リクエストを処理することです。例: app.get() メソッドは get リクエストのみを処理しますが、app.all() は GET、POST、およびその他のリクエストを処理します。

ルートを定義する方法の例を次に示します。

var app = require("express")();

app.get("/", function(req, res, next){
    res.send("Hello World!!!!");
});

app.listen(8080);

各ルート ハンドラーは、現在処理されている HTTP リクエストのリクエスト オブジェクトと応答オブジェクトへの参照を取得します。

単一の HTTP リクエストに対して複数のルート ハンドラーを実行できます。以下に例を示します。
var app = require("express")();

app.get("/", function(req, res, next){
    res.write("Hello");
    next();
});

app.get("/", function(req, res, next){
    res.write(" World !!!");
    res.end();
});

app.listen(8080);

ここでは、最初のハンドルが応答を書き込み、next() を呼び出します。 next()このメソッドは、パス path に一致する次のルート ハンドラーを呼び出すために使用されます。

ルート ハンドラーはリクエストを終了するか、次のルート ハンドラーを呼び出す必要があります。

複数のルート ハンドラーを app.all()app.get()app.post() に渡すこともできます。 app.delete() メソッドと app.put() メソッド。

これを示す例を次に示します。
var app = require("express")();

app.get("/", function(req, res, next){
    res.write("Hello");
    next();
}, function(req, res, next){
    res.write(" World !!!");
    res.end();
});

app.listen(8080);

ミドルウェア

ミドルウェアは、実際のリクエスト ハンドラーの上に位置するコールバックです。ルート ハンドラーと同じパラメーターを受け取ります。

ミドルウェアを理解するために、dashboardprofile ページを含むサンプル サイトを見てみましょう。これらのページにアクセスするには、ユーザーはログインする必要があります。これらのページに対するリクエストも記録されます。

これらのページのルート ハンドラーのコードは次のとおりです:
var app = require("express")();

function checkLogin(){
    return false;
}

function logRequest(){
    console.log("New request");
}

app.get("/dashboard", function(req, res, next){

    logRequest();

    if(checkLogin()){
        res.send("This is the dashboard page");
    }
    else{
        res.send("You are not logged in!!!");
    }
});

app.get("/profile", function(req, res, next){

    logRequest();

    if(checkLogin()){
        res.send("This is the dashboard page");
    }
    else{
        res.send("You are not logged in!!!");
    }
});

app.listen(8080);

ここでの問題は、重複したコードがたくさんあることです。つまり、logRequest()# を使用する必要があります。 ## 複数回実行し、checkLogin() 関数を実行します。これにより、コードの更新も困難になります。したがって、この問題を解決するには、これらの両方のパスに共通のパスを作成します。

これは書き直されたコードです:
var app = require("express")();

function checkLogin(){
    return false;
}

function logRequest(){
    console.log("New request");
}

app.get("/*", function(req, res, next){
    logRequest();
    next();
})

app.get("/*", function(req, res, next){
    if(checkLogin()){
        next();
    }
    else{
        res("You are not logged in!!!");
    }
})

app.get("/dashboard", function(req, res, next){
    res.send("This is the dashboard page");
});

app.get("/profile", function(req, res, next){
    res.send("This is the dashboard page");
});

app.listen(8080);
ここのコードはよりクリーンで、保守と更新が簡単に見えます。最初の 2 つの定義されたルート ハンドラーは、リクエストを処理するのではなく、リクエストの前処理を担当するため、ここではミドルウェアと呼ばれます。

Express は、特にミドルウェアを定義するために使用される app.use() メソッドを提供します。 app.use() メソッドは app.all() に似ているように見えますが、app.use() がミドルウェアの宣言に適しているため、両者には多くの違いがあります。 app.use() メソッドがどのように機能するかを見てみましょう:

app.use() と app.all() の違い:

CALLBACK

app. use( ) はコールバックを 1 つだけ必要としますが、app.all() は複数のコールバックを作成できます。

PATH

app.use() は、URL が指定されたパスで始まるかどうかのみをチェックし、app.all() は完全なパスと一致するかどうかを確認します。

これを説明する例を示します:
app.use( "/product" , mymiddleware);
// will match /product
// will match /product/cool
// will match /product/foo

app.all( "/product" , handler);
// will match /product
// won't match /product/cool   <-- important
// won't match /product/foo    <-- important

app.all( "/product/*" , handler);
// won't match /product        <-- Important
// will match /product/cool
// will match /product/foo
NEXT()

next() ミドルウェア内で、インターフェイスに応じて次のミドルウェアまたはルート ハンドラーを呼び出します。ダウンして宣言します。ただし、ルート ハンドラーの next() は次のルート ハンドラーのみを呼び出します。次にミドルウェアがある場合はスキップしてください。したがって、ミドルウェアはすべてのルート ハンドラーの前に宣言する必要があります。

これを説明する例を示します:

var express = require('express');
var app = express();

app.use(function frontControllerMiddlewareExecuted(req, res, next){
  console.log('(1) this frontControllerMiddlewareExecuted is executed');
  next();
});

app.all('*', function(req, res, next){
  console.log('(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next');
  next();
});

app.all('/hello', function(req, res, next){
  console.log('(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next');
  next();
});

app.use(function frontControllerMiddlewareNotExecuted(req, res, next){
  console.log('(4) this frontControllerMiddlewareNotExecuted is not executed');
  next();
});

app.get('/hello', function(req, res){
  console.log('(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response');
  res.send('Hello World');
});

app.listen(80);
ここで、

app.use() メソッドの一意性と、ミドルウェアの宣言にこのメソッドが使用される理由を見ていきます。

サンプル サイト コードを書き直してみましょう:
var app = require("express")();

function checkLogin(){
    return false;
}

function logRequest(){
    console.log("New request");
}

app.use(function(req, res, next){
    logRequest();
    next();
})

app.use(function(req, res, next){

    if(checkLogin()){
        next();
    }
    else{
        res.send("You are not logged in!!!");
    }
})

app.get("/dashboard", function(req, res, next){
    res.send("This is the dashboard page");
});

app.get("/profile", function(req, res, next){
    res.send("This is the dashboard page");
});

app.listen(8080);
この記事はここにあります。その他の興味深いコンテンツについては、PHP 中国語 Web サイトの

JavaScript ビデオをご覧ください。チュートリアル列!

以上がExpress.js ミドルウェアの紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。