NodeJS / Express:「app.use」とは何ですか?


332

NodeJSのためのドキュメントexpressモジュール、サンプルコードを有していますapp.use(...)

use関数とは何ですか?どこで定義されていますか?



これらのタイプの質問は、ドキュメントを読むことで回答できます。
ミナ

47
ドキュメントは初心者には少しわかりにくい
KansaiRobot '27 / 04/27

6
上記の重複の可能性は互いに参照している
Afrig Aminuddin

1
ドキュメンテーションは完全に不明確です
Tessaracter

回答:


370

アプリオブジェクトは、Expressサーバーの作成時にインスタンス化されます。それは持っているミドルウェア・スタックにカスタマイズすることができますapp.configure()(これは今バージョン4.xでは推奨されません)

ミドルウェアをセットアップするには、app.use(<specific_middleware_layer_here>)追加するすべてのミドルウェアレイヤーを呼び出し(すべてのパスに汎用にすることも、サーバーが処理する特定のパスでのみトリガーすることもできます)、Expressミドルウェアスタックに追加します。ミドルウェアレイヤーは、の複数の呼び出しで1つずつ追加することも、1回の呼び出しでuseすべて同時に追加することもできます。詳細については、useドキュメントを参照してください。

Expressミドルウェアの概念的な理解の例を示すために、アプリオブジェクトをコンソールにJSONとしてログに記録すると、アプリミドルウェアスタック(app.stack)は次のようになります。

stack: 
   [ { route: '', handle: [Function] },
     { route: '', handle: [Function: static] },
     { route: '', handle: [Function: bodyParser] },
     { route: '', handle: [Function: cookieParser] },
     { route: '', handle: [Function: session] },
     { route: '', handle: [Function: methodOverride] },
     { route: '', handle: [Function] },
     { route: '', handle: [Function] } ]

あなたが推測できるかもしれないように、私app.use(express.bodyParser())app.use(express.cookieParser())、などを呼び出し、これらの高速ミドルウェア「レイヤー」をミドルウェアスタックに追加しました。ルートが空白になっていることに注意してください。つまり、これらのミドルウェアレイヤーを追加したときに、どのルートでもトリガーされるように指定しました。上記のスタックプリントアウトのミドルウェアレイヤーオブジェクトのフィールドの/user/:id文字列として反映されるパスでのみトリガーされるカスタムミドルウェアレイヤーを追加した場合route

各レイヤーは基本的に、ミドルウェアを介したフローに何かを特別に処理する関数を追加しています。

追加することにより、例えばbodyParserあなたが明示ミドルウェアを通じてリクエストを着信サーバーハンドルを確保しています。したがって、着信要求の本文の解析は、ミドルウェアが着信要求を処理するときに行う手順の一部ですapp.use(bodyParser)


116
ありがとうございました。エクスプレス担当者がAPIドキュメントでこれを説明するのはそれほど難しいでしょうか?
ericsoco 2013年

4
つまり、リクエストが受信されると、データは実際のサービスに到達する前にこれらのパーサーを通過します。したがって、たとえば次のようになります。有効なリクエスト->認証->プロセスリクエスト->サーブレスポンス USEは、これらのステップを特定の順序で制御し、並行して実行しませんか?
Adam Hess

2
app.use()の依存性注入は実際に行われているのですか?
Kevin C.

8
app.useに送信される関数はいつ呼び出されますか?高速サーバーを作成した後、またはすべての要求に対して?
Timo Huovinen 2013年

5
@KevinC。いいえ、依存関係の注入ではありません。これはプラグインアーキテクチャです。一般に、この種のアーキテクチャは、フィルターシステム/フィルターパイプライン/パイプとフィルターと呼ばれます。Expressでは、パイプは、next()各ミドルウェアが処理をパイプラインの次の関数に渡すために呼び出すことが期待されるコールバックです。ルーティングシステム(の最初の引数app.use())により、パイプラインはURLに応じて分岐できます
slebetman

50

useExpress HTTPサーバーオブジェクトのルートで使用されるミドルウェアを構成するメソッドです。このメソッドは、Expressが基づくConnectの一部として定義されています。

更新バージョン4.x以降、ExpressはConnectに依存しなくなりました。

以前Expressに含まれていたミドルウェア機能は、現在は別のモジュールにあります。ミドルウェア機能一覧をご覧ください。


3
オンラインドキュメントはこちら:senchalabs.org/connect/proto.html#app.use
Alexander Bird

Nodeミドルウェアがオブジェクトをインスタンス化すると効率的でしょうか?これは、すべてのリクエストで、ミドルウェアが新しいオブジェクトをインスタンス化することを意味しますか?古いオブジェクトは破棄されますか?例app.use(function(){ var object = new SomeConstructor; next(); })
CMCDragonkai

1
@CMCDragonkaiすべてのリクエストでオブジェクトをインスタンス化しても問題ありません。リクエストハンドラのスコープ外のオブジェクトへの参照を保存しない限り、ガベージコレクションが行われます。
jeff_mcmahan 2015

1
リンク用の@AlexanderBird thx(ただし、最初のリンクは現在壊れています)。記録としては、2番目のリンクのドキュメントの冒頭に、「指定されたミドルウェアハンドルを指定されたルートに使用します。デフォルトは/です。この「ルート」は、/以外の値が指定された場合のミドルウェアのマウントポイントです。ミドルウェアは、そのセグメントがリクエストのパス名に存在する場合にのみ有効です。たとえば、/ adminに関数をマウントする場合、/ adminおよび/ admin / settingsで呼び出されますが、/に対しては呼び出されません、または/ posts "。シンプル:)
Adrien Be

40

app.use(middleware)は、リクエストがサーバーに送信されるたびに呼び出されます。


7
単文の回答はすぐに理解でき、他の複数段落の説明よりも役立ちます。
stackAndOverflowed

16

app.use()を使用してミドルウェア関数をマウントするか、指定したパスにマウントします。ミドルウェア関数は、ベースパスが一致したときに実行されます。

たとえば 、次のように、indexRouter.jsでapp.use()を使用している場合:

//indexRouter.js

var adsRouter = require('./adsRouter.js');

module.exports = function(app) {
    app.use('/ads', adsRouter);
}

上記のコードでapp.use()は '/ ads'のパスをadsRouter.jsにマウントします。

今adsRouter.jsに

// adsRouter.js

var router = require('express').Router();
var controllerIndex = require('../controller/index');
router.post('/show', controllerIndex.ads.showAd);
module.exports = router;

adsRouter.jsでは、ads- '/ ads / show'のパスは次のようになり、controllerIndex.ads.showAd()に従って機能します。

app.use([path]、callback、[callback]): コールバックを追加できます。

app.use('/test', function(req, res, next) {

  // write your callback code here.

    });

「mount」の代わりに「map」を使うとわかりやすくなります。
Jeb50、19年

13

app.use()は、Expressアプリのミドルウェアとして機能します。異なりapp.get()app.post()またはそう、あなたが実際に使用することができます()app.useリクエストURLを指定せずに。そのような場合は、どのURLがヒットされても、毎回実行されます。


7

app.use()は次のように機能します。

  1. ノードhttpサーバーインスタンスでトリガーされたイベントを要求します。
  2. expressは、reqオブジェクトを使用して内部操作の一部を実行します。
  3. これは、app.useで指定した処理をExpressが開始するときです。

とてもシンプルです。

そして、そうしてはじめてExpressがルーティングのような残りのことを行います。


6
app.use(function middleware1(req, res, next){
   // middleware1 logic
}, function middleware1(req, res, next){
   // middleware2 logic
}, ... middlewareN);

app.useは、ミドルウェア登録シーケンスの順序に応じてエンドルートロジックまたは中間ルートロジックを実行する前に、ミドルウェアまたはミドルウェアのチェーン(または複数のミドルウェア)を登録する方法です。

ミドルウェア:3つのパラメーターreq、res、およびnextを使用して、関数/ミドルウェア関数のチェーンを形成します。次は、チェーン内の次のミドルウェア関数を参照するコールバックであり、チェーンの最後のミドルウェア関数の場合は、次のミドルウェアチェーンの最初のミドルウェア関数を指します。


1
魅力のように動作します!!
Anmol Rai

3

「エクスプレス」からエクスプレスをインポートしてapp = express();を使用すると、エクスプレスで。その後、エクスプレスのすべての機能を備えたアプリ

app.use()を使用する場合

Expressプロジェクト全体で使用するモジュール/ミドルウェア機能


3

app.useミドルウェアが必要な機能です。例えば:

 app.use('/user/:id', function (req, res, next) {
       console.log('Request Type:', req.method);
        next();
     });

この例は、/user/:idパスにインストールされているミドルウェア機能を示しています。この関数は、/user/:idパス内のすべてのタイプのHTTPリクエストに対して実行されます。

これはREST Webサーバーに似ていますが、/xx異なるアクションを表すために異なるものを使用します。


答えてくれてありがとう。でも、誰か他の人がその情報をすべて言ったので、私はこの情報には賛成しません。expressでuseできることをすべて説明する必要はないと思います。それが何であるかを知る必要がありました(そして、自分でもっと研究に行く方法を知るためのコンテキスト知識も)。
アレクサンダーバード

3

app.useは、アプリリクエストのミドルウェアとしての中華です。構文

app.use('pass request format',function which contain request response onject)

app.use('/',funtion(req,res){
 console.log(all request pass through it);
// here u can check your authentication and other activities.
})

また、リクエストをルーティングする場合にも使用できます。

app.use('/', roting_object);

2

ミドルウェアは、「接着」するソフトウェアの総称です。したがって、app.useは、ミドルウェアを構成するためのメソッドです。例:リクエストの本文を解析して処理する:app.use(bodyParser.urlencoded({extended:true })); app.use(bodyParser.json()); Expressアプリケーションで使用できるミドルウェアはたくさんあります。ドキュメントを読むだけです。http//expressjs.com/en/guide/using-middleware.html


2

app.useは、指定されたミドルウェアをメインアプリミドルウェアスタックに適用します。ミドルウェアをメインアプリスタックに接続する場合、接続の順序が重要です。ミドルウェアBの前にミドルウェアAを接続すると、ミドルウェアAが常に最初に実行されます。特定のミドルウェアが適用されるパスを指定できます。以下の例では、「hello world」は常に「楽しい休暇」の前に記録されます。

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

app.use(function(req, res, next) {
  console.log('hello world')
  next()
})

app.use(function(req, res, next) {
  console.log('happy holidays')
  next()
})

2

それはあなたが(任意のミドルウェアを使用することができます続きを読むなど)body_parserCORSなどのミドルウェアがに変更を加えることができますrequestし、responseオブジェクトを。また、コードを実行することもできます。


回答ありがとうございます。しかし、その情報はすべて他の回答に既に取り込まれていると思います
Alexander Bird

2

次のような独自のミドルウェア関数を作成することもできます

app.use( function(req, res, next) {
  // your code 
  next();
})

これは3つのパラメータが含まれているreqresnext
あなたはまた、きれいなあなたのコントローラーを維持するために、入力のparamsの認証および検証のためにそれを使用することができます。

next()次のミドルウェアまたはルートに移動するために使用されます。
ミドルウェアから応答を送ることができます


1

app.use()およびapp.METHOD()関数を使用して、アプリケーションレベルのミドルウェアをアプリオブジェクトのインスタンスにバインドします。METHODは、ミドルウェア関数が処理するリクエストのHTTPメソッドです(GET、PUT、 POST)小文字で。


1

つまり、app.use()はすべてのタイプのリクエスト[eg:get、post、...]をサポートするため、主にミドルウェアのセットアップに使用されます。またはルートと機能が分かれているときに使用できます

例:

app.use("/test",functionName)

そしてfunctionNameは別のファイルにあります


答えてくれてありがとう。でも、その情報はすべて他の答えにすでに取り込まれていると思います。
Alexander Bird、

1

app.use() ミドルウェア方式です。

ミドルウェアメソッドはJavaのインターセプターのようなものであり、このメソッドは常にすべての要求に対して実行されます。

ミドルウェアの目的と使用:-

  1. セッションが期限切れかどうかを確認するには
  2. ユーザー認証および承認用
  3. Cookieを確認する(有効期限)
  4. 応答前にデータを解析する

ミドルウェアはapp.use()に渡される関数です。
NattyC

1

app.use
は、express(nodejsミドルウェアフレームワーク)によって作成され
ます。app.useは、特定のクエリを実行するときに使用されます。server.js
(node)
var app = require( 'express'); したがって、基本的にapp.use関数は、サーバーが起動するたびに呼び出されます
app.use(bodyparser.json())


0

app.useはアプリケーションレベルのミドルウェアです。

app.use()およびapp.METHOD()関数を使用して、アプリケーションレベルのミドルウェアをアプリオブジェクトのインスタンスにバインドします。METHODは、ミドルウェア関数が処理するリクエストのHTTPメソッドです(GET、PUT、 POST)小文字で。

を使用してすべてのリクエストをチェックできます。たとえば、app.useを使用してミドルウェアを作成するために必要なトークン/アクセストークンをチェックし、リクエスト内のトークンをチェックします。

この例は、マウントパスのないミドルウェア機能を示しています。この関数は、アプリがリクエストを受け取るたびに実行されます。

var app = express()

app.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

https://expressjs.com/en/guide/using-middleware.htmlからの参照


app.use()はミドルウェアではありません。ミドルウェアはapp.use()に渡される関数です
NattyC

0

app.use(path、middleware)は、対応するパスのルートにヒットする前に呼び出す必要があるミドルウェア関数を呼び出すために使用されます。app.useを介して複数のミドルウェア機能を呼び出すことができます。

app.use( '/ fetch'、enforceAuthentication) -> enforceAuthenticationミドルウェアfnは、「/ fetch」で始まるリクエストを受信したときに呼び出されます。/ fetch / users / fetch / ids / {id}などにすることができます

一部のミドルウェア機能は、要求に関係なく呼び出さなければならない場合があります。このような場合、パスは指定されません。パスのデフォルトは/であり、すべてのリクエストは/で始まるため、このミドルウェア関数はすべてのリクエストに対して呼び出されます。

app.use(()=> {//共通サービスを初期化します})

next() fnは、複数のミドルウェア関数がapp.useに渡されるときに各ミドルウェア関数内で呼び出される必要があります。そうでない場合、次のミドルウェア関数は呼び出されません。

参照:http : //expressjs.com/en/api.html#app.use

注:ドキュメントには、現在のミドルウェア関数内でnext( 'route')を呼び出すことにより、現在のミドルウェア関数をバイパスできると記載されていますが、この手法はapp.use内では機能しませんでしたが、以下のようにapp.METHODで機能しました。したがって、fn1とfn2は呼び出されましたが、fn3は呼び出されませんでした。

app.get('/fetch', function fn1(req, res, next)  {
    console.log("First middleware function called"); 
        next();
    }, 
    function fn2(req, res, next) {
        console.log("Second middleware function called"); 
        next("route");
    }, 
    function fn3(req, res, next) {
        console.log("Third middleware function will not be called"); 
        next();
    })
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.