2015-03-19 53 views
0

我對SPA網站的後端設計有這個想法。我會實現它,以便以「/ api /」開頭的路由僅返回JSON中的相關數據。所有其他路線將導致整頁加載。在express.js中修改res對象

現在我的想法是做中間件,因爲這樣:

app.use(function(req, res, next()){ 
    if(req.path.split("/")[0]=="api"){ 
    res.send = res.json; 
    //or other custom response-function, I see many possibilities here! 
    }else{ 
    ... 
    } 
}); 
app.use(routes); 

現在,我的問題是,這是否修改資源在全球範圍對象,或只爲當前請求(RES的這種情況下) ?我的理解只是當前的一個被修改,並且據我所知這是真的,但節點非常快,所以它很難單獨測試(只能在毫秒內刷新很多標籤!)任何人都知道當然?

編輯:很多回答我的問題的人問我爲什麼要這樣做。關鍵是要抽象服務器爲加載前端的客戶端以及需要整頁的客戶端提出的請求。我也在考慮使用這種相同的方法添加路徑來加載部分模板的可能性。通過修改res.send我的控制器可能會擔心獲取數據併發送它,res.send已經知道是否需要涉及某些渲染。雖然res.send雖然真的有用,但我可能會修改res以res.answer或類似的方式(使得更少混淆!)

+0

我認爲這是全球性的。如果你不確定它,你可以把一個日誌(前console.log或其他),並檢查它。 – 2015-03-19 03:41:44

+0

'res'是一種對象類型的一個實例。你只修改那個實例。 node.js可以很容易地使用自己的'res'對象一次播放多個請求/響應。 – jfriend00 2015-03-19 03:49:40

+0

你可以完全做到這一點 - 它不像你修改原型。但真正的問題是爲什麼你想這樣做。特別是如果你將一個對象或數組傳遞給res.send,它會自動運行,就像你調用res.json一樣。閱讀文檔。 http://expressjs.com/4x/api.html#res.send – 2015-03-19 04:48:31

回答

1

我決定讓這個答案,因爲有時未來的讀者不讀評論。

1)您可以修改res及其會員以瞭解您的內容。您正在使用響應實例,而不是其原型。沒有「全球」資源,但它確實有一個原型。

2)讀the documentation將在這裏還清。如果它傳遞了一個對象或數組,則res.send的操作與res.json相同。也就是說,在典型情況下,其他代碼的運行方式與如果您沒有與res.send()猴子相同,但會在幾個月或幾年後混淆某人(也許是您)。

+0

想要評論'res.json()'也可以在內部調用'res.end()',而'res.send()'不會。 – juunas 2015-03-19 05:08:40

+0

這是正確的。然而,如果用res.send()調用'res.json()'(調用'res.end()'),如果用一個對象或數組調用,我不確定你在驅動什麼。就像我說的 - 如果傳遞一個對象或數組,它的運行方式是一樣的。 https://github.com/strongloop/express/blob/master/lib/response.js#L134 – 2015-03-19 05:44:46

+0

啊,我明白了,我並不知道這個事實。 – juunas 2015-03-19 05:56:02

0

我測試了這一點,並且每次有響應請求時對象具有原始發送功能而不是更改的值。所以不,它不會在全球範圍內改變它。

這裏是測試我所做的:

app.use(function(req, res){ 
    console.log(res.send); 
    res.send = 'a'; 
    console.log(res.send); 
}); 

雖然我還是不明白爲什麼要這麼做?看起來當有人看着你的API路線並看到res.send(),但效果會改變爲res.json。爲什麼你不能在你的API路由功能中使用res.json