2012-04-10 44 views
0

我不確定我在這裏問的是正確的問題......所以請不要攻擊我。Node.js中的createReadStream中的替代數據

我正在爲一種跟蹤實現創建自己的異步回調庫。用戶必須在其網站上安裝一段包含唯一帳號的代碼。認爲Google Analytics。

庫調用會伸出到我的節點服務器,並在查詢參數中傳遞帳戶ID。

節點響應分析庫,因此可以在用戶的​​站點上調用各種跟蹤功能。

我的問題是,我如何修改我的靜態跟蹤庫,基於查詢參數流回到用戶的頁面?例如,一旦從查詢字符串中讀取帳戶ID,我會進行數據庫查找以查找庫中某些特定於該用戶的值,並且想要適當修改庫中的特定功能。

我正在用我的本地服務器讀取一個靜態文件: fs.createReadStream(「./ file.js」);

如何修改該文件以替代其他文件中的某些值?

或者我應該在啓動時將文件讀入內存中的對象,然後通過響應對象直接寫出修改過的數據?

+0

我建議做你的建議在最後 - 把文件讀入內存,修改那裏,然後發出修改後的文件 – ControlAltDel 2012-04-10 22:01:23

+0

你的意思是讀在每次請求時將文件存入內存,還是隻做一次,並在響應中修改它? – EvilJordan 2012-04-11 02:42:31

回答

0

你可以簡單地使用生態EJS模板這一點,但只是有一個想法,或者如果你喜歡這樣做你自己,我覺得你應該根據你的file.js模板,然後編寫用戶代碼的特定部分與corersponding數據使用一組正則表達式。

例如:

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); 
} 

UPDATE

考慮緩存儘可能的方式...

+0

我喜歡這樣,但是不存在一些固有的「做事情的錯誤方式」,將文件讀入內存以獲取每個響應以及createReadStream是爲了解決什麼問題? – EvilJordan 2012-04-11 02:41:48

+0

該文件應該只讀取一次(或每次修改模板文件時),並且其內容將替換每個請求,爲每個用戶緩存結果並僅重建用戶數據更新的結果以獲得更好的性能。 – 2012-04-11 03:30:38

+0

修改示例添加緩存模板內容。但請記住,這只是爲了說明**它是如何做到的。您不需要重新發明輪子,使用[* eco *](https://github.com/sstephenson/eco)或[* ejs *](http:// embeddedjs。com /)或任何其他酷模板引擎。 – 2012-04-11 03:38:46