2

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でこれを行う方法はありますか?

request1 つの方法は、すべての関数にアラウンドを渡すことです。私の特定のケースでは、これは複雑すぎて実行できないため、可能であればこれを回避したいと考えています。

これを行う別の方法は、テンプレートを表示する方法と同様に、カスタム 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自動的に (内部的に) に設定されます。

4

1 に答える 1

2

スレッドという意味ではありません。JavaScript はシングルスレッドであるため、ノードはシングルスレッドです。うるさいというつもりはありませんが、学んだ命名法を使えば、人々はあなたのことをよりよく理解できるでしょう。「スレッド」と「プロセス」という言葉は、OS レベルですでにあまりにも重く過負荷になっているため、それが本当に意味することでない限り、避けるのが最善です。

node では、リクエスト オブジェクト全体を渡すことは非常に一般的です。

このアイデンティティ マップを構築するための強力なユース ケースが提供されていません。詳しく教えていただけますか?

個々のコールバックを追跡する必要がある場合は、guid-generator を使用できます。もちろん、これらの GUID をどこかに保存する必要があり、その方法によっては、スケーリングのボトルネックが発生する可能性があります。

ああ..あなたの編集が表示されました...「App.Userクエリが結果を保存できる場所」と書いている場所(および他のモデルは結果を保存できるため、再度要求された場合、データベースにヒットしません)。 " あなたはすでに非常に高いレベルで考えています。これは node.js に関する質問ではなく、フレームワークに関する質問です。つまり、node.js は低レベルのキットであり、高レベルのフレームワークとして販売されています。これは基本的に、スレッド プールによってサポートされるイベント ループを備えた JavaScript のマッシュアップです。ちなみに、それはOSスレッドです。あなたの質問への答えは、データベースへの余分なヒットを避けたい場合は、オブジェクトにキャッシュを明示的に提供する必要があるということかもしれません。私の知る限り、ノードに焼き付けられた高レベルの魔法はありません。あまり役に立たないことはわかっていますが、

Re: グローバル。やらないでください。友達は、友達にグローバルへの書き込みを許可しません。:)

于 2012-07-23T22:01:48.933 に答える