2015-01-31 28 views
0

我需要在App.json被調用後,將app.json和app.jsonp響應中的數據添加到express中,將中間件添加到此的正確方法是什麼?我知道我大概可以這樣做:在表達式中「掛鉤」到app.response函數的正確方法是什麼?

var jsonTemp = function(status, data) { 
    if (!data) { 
    data = status; 
    status = 200; 
    } 
    data.extraValue = 'foo'; 
    res.json(status, data); 

} 
res.json = jsonTemp; 

但是像這樣的猴子修補似乎是一個「壞主意」。有沒有官方的方式來與某種中間件掛鉤?

+0

「鉤入響應」的含義並不清楚嗎?響應是一個對象。請求是事件。不知何故,你的意思是「掛鉤請求」嗎? – jfriend00 2015-01-31 20:30:29

+0

您可以編寫urls的中間件並在其中插入您的邏輯 – 2015-01-31 20:55:20

+0

對不起,如果我不清楚,我需要能夠在調用rest.json之後將數據添加到JSON結果中,因此無法在通常的中間件位置,因爲它發生在標準處理程序之後。 – 2015-01-31 21:31:01

回答

2

我認爲猴子補丁實際上可能是最好的解決方案,而不知道你想解決什麼問題。你顯示的代碼確實會使服務器崩潰,所以不要使用它。

app.use(function (req, res, next) { 

    var orig = res.json; 
    res.json = function json(status, data) { 

    if (!data) { 
     data = status; 
     status = 200; 
    } 

    data.extraValue = 'foo'; 
    orig.call(this, status, data); 
    }; 

    next(); 
}); 

這裏我存儲的原有功能的變量orig,然後委託給一個當我與修改完成。你的代碼一遍又一遍地調用你的修改過的函數,因爲那個函數現在生活在res.json之下。

0

您可以註冊自己的template engine來設置輸出格式。也許這有幫助。

+0

創建一個json視圖渲染器看起來像是一個糟糕的黑客,只有在它被髮回給用戶之前才能訪問json。 – 2015-02-11 18:55:44

+0

我同意。順便說一句,爲什麼在生成之後需要更改JSON輸出?你能舉一個例子嗎?也許我們可以考慮以更好的方式解決這個問題。 – 2015-02-11 19:06:25

+0

目前,如果cookie不受支持,我需要將會話cookie作爲JSON值傳遞。是的,我可以在每次生成JSON時添加一個函數調用,但是對於5個文件有超過50個以上的用途,並且丟失或忘記添加它只會導致僅在不支持cookie的地方出錯,從而難以調試)。我可以想象通過向所有字段添加SHA-1校驗和來增加防止中間人攻擊的防篡改等用途。 – 2015-02-11 19:22:10

相關問題