所以,我有一个如下所示的路由函数:
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”对象的引用。我该怎么做呢?谢谢。
最佳答案
嗯...有趣的问题:
做你想做的事情并非不可能,流程如下:
- 接收http请求,不响应,将
res
对象保存在某处。 - 接收 websocket 请求,对其进行身份验证/“链接”到之前保存的
res
对象。 - 通过
res
响应文件。
- 接收http请求,不响应,将
但是由于以下几个原因它不是很漂亮:
- 您需要保存 res 对象,如果您的服务器重新启动,则会丢失一大堆响应对象。
- 您需要弄清楚如何将 websocket 客户端链接到 http 请求客户端。我认为你可以使用 cookies/localstorage 来做到这一点。
- 扩展到另一台服务器将变得更加困难/您是否会以某种方式代理客户端始终由同一台服务器提供服务?否则链接会变得更加困难。
我会为你提出一个不同的解决方案:你想在让别人下载文件之前使用 websockets 执行一些客户端/服务器步骤吗?
这个问题有一个通过 websocket 下载的解决方案:receive file via websocket and initiate download dialog
- 听起来它不适用于较旧的浏览器/IE,但这是一个不错的选择。
- 还提到通过隐藏的 iframe 下载
在此处检查此解决方案是否足以满足您的跨浏览器需求:http://caniuse.com/#feat=datauri
另一种选择是生成一个唯一的下载 URL,并且仅在通过 websocket 完成逻辑后将其附加到浏览器窗口(作为隐藏的 iframe 下载或作为简单的下载按钮)。此选项将更易于跨浏览器使用并且更易于编码。
关于node.js - 在路由函数之外发送 http 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13326815/