所以,我有一个如下的路线功能:
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
}
}
当调用套接字事件'event'时,我想执行如下的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'对象。我该怎么做呢?感谢。
答案 0 :(得分:2)
嗯...有趣的问题:
做一些像你想做的事情并非不可能,流程将是这样的:
res
对象保存在某处。res
对象。res
回复文件。但由于以下几个原因,它不是很漂亮:
我会为您提出一个不同的解决方案:您想在让某人下载文件之前使用websockets执行一些客户端/服务器步骤吗?
这个问题有一个通过websocket进行下载的解决方案:receive file via websocket and initiate download dialog
请在此处查看此解决方案是否适合您的跨浏览器:http://caniuse.com/#feat=datauri
另一种选择是为下载生成一个唯一的URL,只有在您通过websocket完成逻辑后,才会将其附加到浏览器的窗口(作为隐藏的iframe下载,或作为简单的下载按钮)。这个选项可以跨浏览器使用,更容易编码。