検索

Node.jsミドルウェアの仕組み

Sep 30, 2020 pm 06:01 PM
node.jsミドルウェア

Node.jsミドルウェアの仕組み

ビデオ チュートリアルの推奨: node js チュートリアル

Express ミドルウェアとは何ですか?

  • ミドルウェアとは、文字通り、ソフトウェアの 1 つの層と別の層の間に配置されるものを意味します。
  • Express ミドルウェアは、Express サーバーへのリクエストのライフサイクル中に実行される機能です。
  • 各ミドルウェアは、接続されているすべてのルートの HTTP 要求と応答にアクセスできます。
  • さらに、ミドルウェアは HTTP リクエストを終了したり、next を使用して別のミドルウェア関数に渡すことができます。このミドルウェアの「チェーン」により、コードを分割し、再利用可能なミドルウェアを作成できます。

Express ミドルウェアを作成するための要件

Express ミドルウェアを作成、使用、テストするには、いくつかのものをインストールする必要があります。まず、Node と NPM が必要です。インストールされていることを確認するには、次のコマンドを実行します。

npm -v && node -v

インストールされている Node と NPM のバージョンが表示されるはずです。エラーが発生した場合は、Node をインストールする必要があります。すべての例は、Node ver 8 および NPM ver 5 で使用する必要があります。

この記事では Express バージョン 4.x を使用します。バージョン 3.x からバージョン 4.x では大幅な変更が加えられたため、これは重要です。

Express ミドルウェア: 基本

まず、Express の最も基本的な組み込みミドルウェアを使用します。新しいプロジェクトを作成し、npm で初期化します...

npm init
npm install express --save

Create server.js and paste the following code:

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

app.get('/', (req, res, next) => {
  res.send('Welcome Home');
});

app.listen(3000);

ミドルウェアはどのような問題を解決しますか?なぜそれを使うのでしょうか?

Web サーバー上で Node.js と Express を使用して Web アプリケーションを実行しているとします。このアプリでは、一部のページでログインが必要となります。

Web サーバーがデータのリクエストを受信すると、Express はユーザーとユーザーがリクエストしたデータに関する情報を含むリクエスト オブジェクトを提供します。 Express では、Web サーバーがユーザーに応答する前に変更できる応答オブジェクトへのアクセスも提供します。これらのオブジェクトは通常、

reqres に短縮されます。

ミドルウェア関数は、関連情報を含む

req オブジェクトと res オブジェクトを変更するのに最適な場所です。たとえば、ユーザーがログインした後、データベースからユーザーの詳細を取得し、これらの詳細を res.user に保存できます。

ミドルウェア機能とはどのようなものですか?

async function userMiddleware (req, res, next) {
    try {
        const userData = await getUserData(req.params.id);  //see app.get below

        if(userData) {
                req.user = userData;
                next();
        }
    } catch(error)  {
        res.status(500).send(error.message); //replace with proper error handling
    }
}

エラーが発生し、他のコードを実行したくない場合は、この関数を呼び出さないでください。この場合は必ず応答を送信してください。送信しないと、クライアントはタイムアウトになるまで応答を待機することになります。

var app = express();

//your normal route Handlers
app.get('/user/:id', userMiddleware, userController);

ミドルウェア チェーン

ミドルウェア配列内で、または複数の

app.use 呼び出しを使用してミドルウェアをチェーンできます:

app.use(middlewareA);
app.use(middlewareB);
app.get('/', [middlewareC, middlewareD], handler);

Express リクエストを受信した後、リクエストに一致した各ミドルウェアは、終了操作があるまで初期化の順序で実行されます。

Node.jsミドルウェアの仕組み

したがって、エラーが発生した場合、エラーを処理するすべてのミドルウェアが順番に呼び出され、そのうちの 1 つが

next() を呼び出さなくなるまで、関数が呼び出されるまで続きます。と呼ばれます。

Express ミドルウェアの種類

    ルーター レベルのミドルウェア (例: router.use)
  • 組み込みミドルウェア (例: Express.static、express)。 json、express.urlencoded
  • エラー処理ミドルウェア、例: app.use(err、req、res、next)
  • サードパーティ ミドルウェア、例: bodyparser、cookieparser
  • ルーター レベルのミドルウェア
  • express.Router モジュール式のインストール可能なルーティング処理を作成するには、express.Router クラスを使用します。ルーティング インスタンスは、完全なミドルウェアおよびルーティング システムです。

      ロギング、認証などにミドルウェアを使用できます。以下に示すように、ユーザーの最新のアクティビティを記録し、認証ヘッダーを解析するには、それを使用して現在ログインしているユーザーを特定し、それを Request オブジェクトに追加します。
    • この関数は、プログラムがリクエストを受信するたびに実行されます。エラーが発生した場合は、後続のミドルウェアやルート処理を呼び出すことなく、単に応答を終了します。
  • var router = express.Router()
    //Load router-level middleware by using the router.use() and router.METHOD() functions.
    //The following example creates a router as a module, loads a middleware function in it,
    //   defines some routes, and mounts the router module on a path in the main app.
    var express = require(‘express’);
    var router = express.Router();
    
    // a middleware function with no mount path. This code is executed for
    //   every request to the router
    // logging
    async function logMiddleware (req, res, next) {
        try {
             console.log(req.user.id, new Date());
         next();
        } catch() {
            res.status(500).send(error.message);
        }
    }
    // authentication
        async function checkAuthentication(req, res, next) => {
    // check header or url parameters or post parameters for token
    const token = req.body.token || req.query.token || req.headers['x-access-token']
     || req.headers['authorization'];
          if (token) {
            try {
                // verifies secret
                req.decoded = await jwt.verify(token, config.secret)
    
                let checkUser = await authenticateTokenHelper.getUserDetail(req);
    
                // if everything is good, save to request for use in other routes
                    if (checkUser) {
                            req.user = req.decoded
                            next()
                    } else {
                        return res.status(403).json({ 
                        message: responseMessage.noAuthorized 
                        })
                    }
            } catch (err) {
                return res.status(401).json({ message: responseMessage.invalidToken })
            }
      } else {
        // if there is no token
        return res.status(400).json({ message: responseMessage.invalidRequest })
      }
    }
    router.use(logMiddleware);
        router.get('/user, checkAuthentication, handler);
組み込みミドルウェア

Express には、次の組み込みミドルウェア機能があります:

  • express。 static HTML ファイルや画像などの静的リソースを提供します。
  • express.json ペイロードは、JSON で受信したリクエストを解析します。
  • express.urlencoded 受信した URL エンコードされたペイロード要求を解析します。
エラー処理ミドルウェア

エラー処理ミドルウェアは常に 4 つのパラメーター

(err、req、res、next) を受け取ります。 4 つのパラメーターを指定して、エラー処理ミドルウェア関数として識別する必要があります。次のオブジェクトを使用する必要がない場合でも、それを指定する必要があります。それ以外の場合、次のオブジェクトは通常のミドルウェアとして解釈され、エラーは処理されません。基本的な署名は次のようになります:

app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})

例 1:

app.get('/users', (req, res, next) => {
  next(new Error('I am passing you an error!'));
});
app.use((err, req, res, next) => {
  console.log(err);    
  if(!res.headersSent){
    res.status(500).send(err.message);
  }
});

在这种情况下,管道末端的错误处理中间件将会处理该错误。你可能还会注意到,我检查了 res.headersSent 属性。这只是检查响应是否已经将标头发送到客户端。如果还没有,它将向客户端发送 HTTP 500  状态和错误消息。

例2:

你还可以链接错误处理中间件。通常以不同的方式处理不同类型的错误:

app.get('/users, (req, res, next) => {
  let err = new Error('I couldn\'t find it.');
  err.httpStatusCode = 404;
  next(err);
});

app.get('/user, (req, res, next) => {
  let err = new Error('I\'m sorry, you can\'t do that, Dave.');
  err.httpStatusCode = 304;
  next(err);
});

app.use((err, req, res, next) => {
   // handles not found errors
  if (err.httpStatusCode === 404) {
    res.status(400).render('NotFound');
  }
   // handles unauthorized errors 
  else if(err.httpStatusCode === 304){
    res.status(304).render('Unauthorized');
  }
    // catch all
   else if (!res.headersSent) {
     res.status(err.httpStatusCode || 500).render('UnknownError');
  }
  next(err);
});
  • 在这种情况下,中间件检查是否抛出了 404(not found)错误。如果是,它将渲染 “NotFound” 模板页面,然后将错误传递到中间件中的下一项。
  • 下一个中间件检查是否抛出了 304(unauthorized)错误。如果是,它将渲染“Unauthorized”页面,并将错误传递到管道中的下一个中间件。
  • 最后,“catch all” 错误处理仅记录错误,如果未发送响应,它将发送错误的 httpStatusCode(如果未提供则发送 HTTP 500 状态)并渲染 “UnknownError” 模板。

第三方级别的中间件

在某些情况下,我们将向后端添加一些额外的功能。先安装 Node.js 模块获取所需的功能,然后在应用级别或路由器级别将其加载到你的应用中。

示例:当 body-parser 处理 Content-Type 请求标头时,所有中间件都将使用解析的正文填充 req.body 属性。

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())
app.post('/save',(req,res)=>{
    res.json({
        "status":true,
         "payload":req.body
    })
}
app.listen(3000,(req,res)=>{
    console.log('server running on port')
})

总结

中间件功能是一种非常好的方式,可以对每个请求或针对特定路由的每个请求运行代码,并对请求或响应数据采取措施。中间件是现代 Web 服务器的重要组成部分,并且非常有用。

更多编程相关知识,请访问:编程入门!!

以上がNode.jsミドルウェアの仕組みの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はthirdrocktechknoで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

pythonまたはjavascriptの方がいいですか?pythonまたはjavascriptの方がいいですか?Apr 06, 2025 am 12:14 AM

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。