検索
ホームページウェブフロントエンド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 服务器的重要组成部分,并且非常有用。

英文原文地址:https://www.thirdrocktechkno.com/blog/how-Node-JS-middleware-works/

为了保证的可读性,本文采用意译而非直译。

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

以上がNode.js ミドルウェアがどのように機能するかについての簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はsegmentfaultで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Vercel是什么?怎么部署Node服务?Vercel是什么?怎么部署Node服务?May 07, 2022 pm 09:34 PM

Vercel是什么?本篇文章带大家了解一下Vercel,并介绍一下在Vercel中部署 Node 服务的方法,希望对大家有所帮助!

node.js gm是什么node.js gm是什么Jul 12, 2022 pm 06:28 PM

gm是基于node.js的图片处理插件,它封装了图片处理工具GraphicsMagick(GM)和ImageMagick(IM),可使用spawn的方式调用。gm插件不是node默认安装的,需执行“npm install gm -S”进行安装才可使用。

一文解析package.json和package-lock.json一文解析package.json和package-lock.jsonSep 01, 2022 pm 08:02 PM

本篇文章带大家详解package.json和package-lock.json文件,希望对大家有所帮助!

分享一个Nodejs web框架:Fastify分享一个Nodejs web框架:FastifyAug 04, 2022 pm 09:23 PM

本篇文章给大家分享一个Nodejs web框架:Fastify,简单介绍一下Fastify支持的特性、Fastify支持的插件以及Fastify的使用方法,希望对大家有所帮助!

怎么使用pkg将Node.js项目打包为可执行文件?怎么使用pkg将Node.js项目打包为可执行文件?Jul 26, 2022 pm 07:33 PM

如何用pkg打包nodejs可执行文件?下面本篇文章给大家介绍一下使用pkg将Node.js项目打包为可执行文件的方法,希望对大家有所帮助!

node爬取数据实例:聊聊怎么抓取小说章节node爬取数据实例:聊聊怎么抓取小说章节May 02, 2022 am 10:00 AM

node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!

手把手带你使用Node.js和adb开发一个手机备份小工具手把手带你使用Node.js和adb开发一个手机备份小工具Apr 14, 2022 pm 09:06 PM

本篇文章给大家分享一个Node实战,介绍一下使用Node.js和adb怎么开发一个手机备份小工具,希望对大家有所帮助!

图文详解node.js如何构建web服务器图文详解node.js如何构建web服务器Aug 08, 2022 am 10:27 AM

先介绍node.js的安装,再介绍使用node.js构建一个简单的web服务器,最后通过一个简单的示例,演示网页与服务器之间的数据交互的实现。

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ヘンタイを無料で生成します。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン