2016-09-06 12 views
1

コールバックに 'req'パラメータがない場合、reqオブジェクトにアクセスする方法を知ります。Node.js Expressのどこにでも現在のreqオブジェクトにアクセス

ExpressJでは、私は共通の機能を持っています。「req」オブジェクトで何かを処理するために使用されますが、reqは渡されません。

module.exports = { 
    get: function(){ 
     var req = global.currentRequest; 
     //do something... 
    } 
} 

私の現在のソリューションは、私はすべての要求のためのミドルウェアを書くことで、私はその後、私は「global.currentRequest」でどこでも「REQ」にアクセスすることができ、グローバル変数に「REQ」を置きます。

// in app.js 
app.use(function (req, res, next) { 
    global.currentRequest= req; 
    next(); 
}); 

しかし、それが良いかどうかわかりません。誰にでも提案はありますか?
ありがとうございました!

+0

本当に選択せずに残っ​​ていない限り、グローバル変数は使用しないでください。それは反パターンとみなされます。参照してください:http://stackoverflow.com/questions/18635136/why-are-global-variables-considered-bad-practice-node-js –

+0

唯一の適切な方法は、すべての関数の引数として 'req'を渡すことですそれを必要とする。要求を処理の一部として非同期呼び出しを使用し、複数の要求が互いに激しくぶつかり合ってバグを追跡することができない場合、同時に複数の要求が処理中である可能性があるため、グローバルでの処理は単純に機能しません。ここにはショートカットはありません。現在の要求を引数として必要なコードに渡します。 – jfriend00

+0

jfriend00のように書いたのは本当に悪い考えです。また、スタック上で何百もの時間について議論されており、適切な解決策を見つけることはできません。問題は、非同期プログラミングのための同期思考を適用しようとしていることです。頻繁に映画のKungfuの主人はあなたの思考の方法を変えなければならないことを言う。 –

答えて

0

グロバルではなく、 は、module.exportsをラップしてreqをパラメータとして受け入れることができます。

module.exports = function (req) { 
    function get() { 
     // it has access to req. 
     console.log(req); 
    } 

    return get; 
} 

そして、あなたは

app.use(function (req, res, next) { 
    const mod = require('/path/to/module')(req); 
    next(); 
}); 
+0

問題は、funcがあまりにも多く呼び出され、すべての呼び出し元を変更する必要があるため、reqをその関数のparamとして渡すことができないことです。 – Sky

+0

@Sky「funcがあまりにも多く呼び出されてしまったので、すべての呼び出し元を変更する必要があります」という意味はどうですか?最終的にexpressで 'req'に渡されるすべてのhttpリクエストはユニークです。 –

+0

これはどのように機能するのか分かりませんか?使用例を示すために拡張できますか? – John

0

として上記のモジュールをrequireことができる唯一の適切な方法は、それを必要とするすべての関数の引数としてを通じてreqオブジェクトを渡すことです。

グローバルでは、処理の一部として非同期呼び出しを使用する複数の要求が同時に発生し、複数の要求が互いを突き止めて追跡しにくくなるため、複数の要求を同時に処理できるため、単純に機能しませんバグ。ここにはショートカットはありません。現在の要求を引数として必要なコードに渡します。

リクエスト固有のデータをnode.js内のグローバルに配置することはできません。そうすることで、同時に飛行している2つのリクエストが互いに衝突し、リクエスト間でデータが混乱する可能性があります。多くのクライアントの要求を処理する可能性のあるサーバーであることを覚えておいてください。同期的な、一度に1つの考えをサーバーに使用することはできません。 node.jsサーバーは、同時にすべての飛行中に多数の要求を持つ可能性があるため、要求固有のデータにプレーングローバルを使用することはできません。

ここにはショートカットはありません。 reqオブジェクトを必要な関数に渡すだけで済みます。これは、いくつかの介在する関数の関数シグネチャを変更しなければならないことを意味しています。それはあなたがしなければならないことです。それがこのタイプの問題を解決する唯一の正しい方法です。

クロージャを使用して希望のreqオブジェクトを「キャプチャ」し、内部関数に渡すことなく内部関数で使用することができる場合がありますが、それはあなたの関数であるようには聞こえません構造。可能性があるかどうかを知るには、実際の/実際のコードをもっと多く見なければなりません。

関連する問題