4

Express.jsMongooseを使用して同僚と REST API を開発しています。

一部の MongooseではModel methods、現在リクエストを実行している認証済みユーザーなど、追加のコンテキスト情報ソースとしてオブジェクトstaticsが必要です。Express.js Request

現在行っていることは、の関数のプロトタイピングによってのコンテキストに呼び出さcontextれるカスタム プロパティをアタッチすることです。ModelthisMongooseModel

問題は、厄介なバグに遭遇したことで、インスタンスでModel.methods呼び出された が正常に機能することに気付きました。Model

として実装されている「クラス」でModel.statics呼び出される の場合、スコープはアプリ全体で共有されます。つまり、同時リクエストがある場合、リクエスト処理で非同期動作がある場合、それらは互いの値をオーバーライドします。.Modelsingletonthis.context

今私の質問は次のとおりです。

  • and functionsでコンテキストを保持Express.jsおよびMongooseアクセスするためのベストプラクティスは何ですか?requestModel.staticsModel.methods

もちろん、封じ込めをシミュレートするためのいくつかの可能なハックがあります:

  1. Function.bind()Modelリクエストコンテキストを追加するすべての関数。

    -> これは、Model.statics.a()内部的に を呼び出す場合Model.statics.b()、関数に .b()がないことを意味しますthis.context

  2. with() {}オブジェクトでステートメントを使用し、そのスコープ内のrequestすべての関数を呼び出します。Model

    ->これはかなり汚れていて遅いでしょう。

  3. vm標準の Node.js モジュールを使用して、個別のスコープを持つコンテナーを作成します。

    →(2)と同様、パフォーマンスが大幅に低下します。

何か案は ?前もって感謝します !

4

1 に答える 1

4

あなたがまだ答えに興味を持っていることを願っています

本当に必要なのは、基本的にそのスレッドのコンテキストで何かを定義できるJava のスレッド ローカルの概念を模倣することです。

Node はシングル スレッド環境であり、 domain以外にそのようなものはありません。ドメインは、特定の操作セットのコンテキストを提供し、スレッド ローカル ストレージを模倣するのに非常に役立ちます。

Node js ドメインはまもなく非推奨になりますが、目的を解決するcontinuation-local-storageなどの同様のソリューションがnpm で利用可能です

例: リクエストのコンテキストでドメインを作成する

app.use(function(req, res, next) {
    var reqDomain = domain.create();
    reqDomain.run(next);            //here your request context is created
});

これで、process.domain を使用して、上記で作成したドメインにバインドされた「データ」にどこからでもアクセスできるようになります

var d = process.domain              //process.domain is always be available to you while serving the request
d.obj = {};
于 2015-11-21T08:37:57.727 に答える