Rails では、現在のスレッドはグローバル変数を格納するために頻繁に使用されます (グローバル変数が悪いことは知っていますが、必要になる場合もあります)。
Thread.current[:authlogic_scope] = scope
使用されている場所の一部を次に示します。
問題は、Node.js で同様のことができるかどうかです。具体的には、高速アプリで。
現在のリクエスト (または現在のスレッド) への参照を保持する最善の方法は何ですか?
Express では、要求/応答オブジェクトでコールバックを使用して、グローバル変数を設定する必要がないようにしています。これは理にかなっています。
var express = require('express');
var app = express.createServer();
app.get('/', function(request, response) {
response.send('Hello World');
});
この質問は、データベース レコードをキャッシュするための「アイデンティティ マップ」の作成に関するものです (現在の HTTP 要求/現在のユーザーにスコープが設定されています)。Rails では、ID マップのスコープを に維持することでこれを行うことができます。これはThread.current
、すべてが同期しているためです。Node.jsでこれを行う方法はありますか?
request
1 つの方法は、すべての関数にアラウンドを渡すことです。私の特定のケースでは、これは複雑すぎて実行できないため、可能であればこれを回避したいと考えています。
これを行う別の方法は、テンプレートを表示する方法と同様に、カスタム JavaScript 関数で使用するすべての変数を再定義することです (グローバル変数のように感じる変数をテンプレートで定義します)。しかし、私の特定のケースでは、これは役立つというよりも混乱を招きます。
3 番目の方法は、現在の HTTP 要求または現在のスレッドのみがアクセスできるグローバル変数に設定することです。これはNode.jsで可能ですか? そうでない場合、同じことを達成する他の方法は何ですか?
基本、できるようになりたい
App.User.where({createdAt: {'>=': _(2).days().ago()}}).all()
process.CURRENT_REQUEST
現在のリクエストにスコープされたいくつかの node.js を内部的にチェックし、App.User
クエリがその結果を保存できるようにします (他のモデルは結果を保存できるため、再度リクエストされてもデータベースにはヒットしません)。currentUser
また、Authlogic と同じ方法で受け渡しできるようにしたいので、たとえば、レコードが作成されるたびに、createdById
フィールドはprocess.CURRENT_REQUEST.currentUser
自動的に (内部的に) に設定されます。