2012-04-10 1 views
0

ここで正しい質問をしているかどうかはわかりません...だから私を攻撃しないでください。Node.jsのcreateReadStreamのデータを置換する

トラッキングの実装のための独自の非同期コールバックライブラリを作成しています。ユーザーは、一意のアカウント番号を含むコードをサイトにインストールする必要があります。 Googleアナリティクスを考えましょう。

ライブラリコールが自分のノードサーバーに到達し、クエリパラメータのアカウントIDを渡します。

ノードはアナリティクスライブラリで応答し、ユーザーのサイトでさまざまなトラッキング機能を呼び出すことができます。

私の質問は、クエリパラメータに基づいてユーザーのページにストリーミングされた静的追跡ライブラリを変更するにはどうすればよいですか。たとえば、アカウントIDがクエリ文字列から読み込まれると、私はDBルックアップを実行して、そのユーザーに固有の値をライブラリ内で見つけ出し、自分のライブラリ内の特定の関数を適切に変更したいと考えています。

ローカルサーバーから静的ファイルを読み取っています。 fs.createReadStream( "./ file.js");

このファイルを変更して、他の値の中の特定の値に置き換えることはできますか?

また、起動時にファイルをメモリ内のオブジェクトに読み込んで、応答オブジェクトを介して変更したデータを書き込むだけでいいですか?

+0

私はあなたが最後に提案し何を推薦する - あなたが読んで意味ですか、メモリへのファイルの読み込みが修正し、その後、変更されたファイル – ControlAltDel

+0

を送信しますファイルはすべての要求でメモリに格納されます。 – EvilJordan

答えて

0

あなたは、単にエコまたはこのためEJSテンプレートを使用することができますがためだけのアイデアを持っているか、あなたはこのを自分で作ることを好むならば、私はあなたがあなたのfile.jsに基づいてテンプレートを作るべきだと思うし、ユーザーを書くためにコードの特定の部分を正規表現のセットを使用してコア対応のデータで置き換えます。例えば

template.js

var get_user = function() { 
    return "Hi %%USER_NAME%%" 
} 

はその後req.send() `template.jsの内容は、次のようなものに置き換え:

var result = cached_template_data; 
if (!result) { 
    fs.readFile("./template.js", function (err, data) { 
    result = cached_template_data = data; 
    if (!err) { 
     result = result.replace(/%%USER_NAME%%/g, user.name) 
     res.send(result); 
    } else { 
     // Big oops 
     res.send({error:true}, 500); 
    } 
    }) 
} else { 
    result = result.replace(/%%USER_NAME%%/g, user.name) 
    res.send(result); 
} 

更新

は...仕方によって、可能な限りキャッシュを考えてみましょう

+0

私はこれが好きですが、すべてのレスポンスのためにファイルをメモリに読み込んだり、createReadStreamが修正しようとしていたものがいくつかの固有の「間違ったやり方」ではありませんか? – EvilJordan

+0

ファイルは一度だけ(またはテンプレートファイルが変更されるたびに)読み込まれ、各要求ごとにその内容が置き換えられ、各ユーザーの結果がキャッシュされ、ユーザーデータの更新時に結果が再構築され、パフォーマンスが向上します。 –

+0

テンプレートコンテンツのキャッシュを追加するための変更例。しかし、覚えておいてください。これは、**どうすればいいのかを説明することにすぎません。ホイールを再開発する必要はありません。[* eco *](https://github.com/sstephenson/eco)または[* ejs *](http:// embeddedjs。com /)またはその他のクールなテンプレートエンジンを使用してください。 –

関連する問題