在路由功能之外发送http响应?

时间:2012-11-10 22:48:28

标签: node.js socket.io httpresponse

所以,我有一个如下的路线功能:

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'对象。我该怎么做呢?感谢。

1 个答案:

答案 0 :(得分:2)

嗯...有趣的问题:

  • 做一些像你想做的事情并非不可能,流程将是这样的:

    1. 接收http请求,不响应,保留res对象保存在某处。
    2. 接收websocket请求,将其auth /“链接”到之前保存的res对象。
    3. 通过res回复文件。
  • 但由于以下几个原因,它不是很漂亮:

    1. 如果服务器重新启动,则需要保留res对象,如果丢失了一大堆响应对象。
    2. 您需要弄清楚如何将websocket客户端链接到http请求客户端。我想你可以用cookies / localstorage来做这件事。
    3. 扩展到另一台服务器将变得更加困难/您将代理客户端始终由同一服务器以某种方式提供服务吗?否则链接会变得更难。

我会为您提出一个不同的解决方案:您想在让某人下载文件之前使用websockets执行一些客户端/服务器步骤吗?

请在此处查看此解决方案是否适合您的跨浏览器:http://caniuse.com/#feat=datauri

另一种选择是为下载生成一个唯一的URL,只有在您通过websocket完成逻辑后,才会将其附加到浏览器的窗口(作为隐藏的iframe下载,或作为简单的下载按钮)。这个选项可以跨浏览器使用,更容易编码。