2012-11-10 17 views
1

所以,我有一個路由功能如下所示:在路由功能之外發送http響應?

var http = require('http').createServer(start); 

function start(req, res){ 
//routing stuff 
} 

再下面,我有一個socket.io事件偵聽器:

io.sockets.on('connection', function(socket){ 

    socket.on('event', function(data){ 
     //perform an http response 
    } 

} 

當socket事件「事件」被調用,我想執行類似下面的HTTP響應:

res.writeHead(200, {'Content-disposition': 'attachment; filename=file.zip'}) 
res.writeHead(200, { 'Content-Type': 'application/zip' }); 
var filestream = fs.createReadStream('file.zip'); 

filestream.on('data', function(chunk) { 
    res.write(chunk); 
}); 

filestream.on('end', function() { 
    res.end(); 
}); 

最後這部分,路由功能內執行時工作得很好,但不幸的是,當它是從套接字事件中調用的,它當然不起作用,因爲它沒有引用'req'或'res'對象。我會如何去做這件事?謝謝。

回答

1

嗯......有趣的問題:

  • 這不是不可能做這樣的事情你想做什麼,該流程是這樣的:

    1. 接收HTTP請求,請不要回應,保持res對象保存在某處。
    2. 接收websocket請求,做你的auth /「鏈接」到之前保存的res對象。
    3. 通過res回覆文件。
  • ,但它不是幾個原因很漂亮:

    1. 您需要及時保存資源對象,如果你的服務器重啓一大堆響應對象都將丟失。
    2. 您需要弄清楚如何將websocket客戶端連接到http請求客戶端。我想,你可以用cookies/localstorage做些事情來做到這一點。
    3. 擴展到另一臺服務器會變得更加困難/你會代理客戶端總是以某種方式由同一個服務器提供服務嗎?否則,鏈接將變得更難。

我建議你一個不同的解決方案:你想幹什麼用的WebSockets你讓別人下載文件之前,一些客戶端/服務器的步驟?

檢查該解決方案是否是跨瀏覽器足夠你:http://caniuse.com/#feat=datauri

另一種選擇是生成用於下載一個唯一網址,只要您通過websocket完成您的邏輯,只需將其附加到瀏覽器的窗口(作爲隱藏的iframe下載,或作爲簡單的下載按鈕)。這個選項將更易於跨瀏覽器並且更易於編碼。

+0

嗯,我肯定更傾向於使用第二種解決方案(由於簡單性和兼容性),但我仍然遇到問題。我希望它的工作原理是我創建這個獨特的URL並重定向客戶端,然後將路由器功能路由到我要下載文件的請求。問題:爲了路由這個「即時」url,我將不得不將它添加到我的url處理程序數組中,這是一個公共數組;因此,這個所謂的「獨特」網址不再是唯一的。我將如何將其保存爲客戶特定的網址? – Ari

+0

很多網站只是通過晦澀的網址來做到這一點:當您購買[謙虛的獨立包](http://www.humblebundle.com/)時,您會得到一個唯一的網址,但沒有任何東西阻止您將該網址發送給其他人。要添加一層安全性,您必須將其鏈接到用戶帳戶並進行身份驗證(使用cookie)。 – rdrey

+0

好吧,我想現在要做的就是現在。我知道它正常工作,但我可能會添加一個cookie檢查,就像您在接觸時說的那樣。謝謝您的幫助! – Ari