在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Linux  網(wǎng)絡(luò)安全  HTML/ nodejs 為每一個請求隔離global的問題

nodejs 為每一個請求隔離global的問題

問題描述:

現(xiàn)在的業(yè)務(wù)是這樣的,node服務(wù)端每當(dāng)一個請求進(jìn)來的時候,會連續(xù)執(zhí)行一系列函數(shù)(有同步有異步),并且其中的一部分函數(shù)會把一部分需要用到的cache直接掛在global上面,后繼函數(shù)有些會用到global上面的變量,最終的render函數(shù)(返回給客戶端響應(yīng) json或者h(yuǎn)tml頁面)也會用到global上面的變量(當(dāng)然這個時候也會銷毀變量)。

所以現(xiàn)在問題來了,nodejs并不是一個請求一個請求的處理的,而是先處理同步的內(nèi)容,在有多個請求訪問的時候,前面的請求還沒有處理完,后面的請求就開始處理了,這樣就會污染global上面的變量,導(dǎo)致前面的請求獲得的結(jié)果不正確,還會有內(nèi)存泄漏的隱患。

我知道直接把變量掛在global上面并不是一個最佳實踐,但這里涉及到一些歷史遺留問題,而且改的話也沒有特別好的辦法去解決(如果采用事件機(jī)制的話也會有類似問題)

所以現(xiàn)在想解決這個問題...

我的想法是,對于每一個請求來說最好有一個獨立純凈的global對象,可以互不干擾,并且結(jié)束后自動銷毀。

我試過采用vm模塊的沙箱機(jī)制,但是這樣會有兩個問題:

1.如果把整個服務(wù)端服務(wù)放在一個隔離環(huán)境中,和不放沒什么區(qū)別,該有的問題還是會有。

2.如果把關(guān)鍵模塊放在隔離環(huán)境中(使用vm.runInNewContext),那么就無法在global上掛變量,后繼函數(shù)也就無法獲取到。

最好的辦法當(dāng)然是把所有會往global上面掛變量的部分放在一個隔離環(huán)境中,但是由于涉及到的模塊復(fù)雜,會有一系列的問題。

所以我想知道,有沒有什么別的辦法可以做到對于每一個請求來說最好有一個獨立純凈的global對象,可以互不干擾,并且結(jié)束后自動銷毀, 或者有什么其他的方式可以解決上述困惑?

懇請賜教。

回答
編輯回答
護(hù)她命

1、“前面的請求還沒有處理完,后面的請求就開始處理了”,如果你需要的變量值是前面處理完之后的,那肯定是要進(jìn)行異步流程控制的。

2、每一個 req 請求本身就是一個獨立的對象,并且會在其整個生命周期中傳遞,你完全可以在 req 上自定義屬性用來掛載你的數(shù)據(jù)。

2018年4月2日 01:09
編輯回答
疚幼

在每個 controller 處理函數(shù)里面,起一個變量比如叫 ctx,在后面的函數(shù)處理中,把這個 ctx 當(dāng)做參數(shù)傳遞過去。

因為你說的需求里面,這個所謂的 global 對象是和每個請求的上下文關(guān)聯(lián)的,且獨立,那么不可能做成全局變量的,只可能放在 Controller 處理函數(shù)內(nèi)部。


原生 http. createServer(function(req, res){}), 是有 req/res 對象的,也就是請求獨立的上下文,可以掛載到 req 上。

如果用 koa 等框架,也可以掛載到 ctx 上,ctx 本身就是 req/res 的封裝和擴(kuò)展。

2017年3月17日 12:55
編輯回答
墻頭草

感覺你需要的是session,然而你又掛到global上...

2017年2月19日 17:39