Node.js 是否在路由函数之外发送http响应?

Node.js 是否在路由函数之外发送http响应?,node.js,socket.io,httpresponse,Node.js,Socket.io,Httpresponse,因此,我有一个如下的路由函数: var http = require('http').createServer(start); function start(req, res){ //routing stuff } res.writeHead(200, {'Content-disposition': 'attachment; filename=file.zip'}) res.writeHead(200, { 'Content-Type': 'application/zip' }); var

因此,我有一个如下的路由函数:

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

function start(req, res){
//routing stuff
}
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();
});
下面是socket.io事件侦听器:

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

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

}
调用套接字事件“event”时,我希望执行如下http响应:

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

function start(req, res){
//routing stuff
}
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
    响应文件
  • 但它不是很漂亮,原因有几个:

  • 您需要保存res对象,如果您的服务器重新启动,将丢失大量响应对象
  • 您需要弄清楚如何将websocket客户端链接到http请求客户端。我认为,您可以使用cookies/localstorage来实现这一点
  • 扩展到另一台服务器将变得更加困难/您是否会以某种方式代理客户端始终由同一台服务器提供服务?否则,链接将变得更加困难
我会为您提出一个不同的解决方案:您想在让别人下载文件之前使用WebSocket执行一些客户机/服务器步骤吗

  • 这个问题有一个通过websocket进行下载的解决方案:

    • 听起来它在较旧的浏览器/IE上不起作用,但这是一个不错的选择
    • 还提到通过隐藏iframe下载
在此处检查此解决方案是否足够跨浏览器:


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

当然,我更倾向于使用第二个解决方案(由于简单性和兼容性),但我仍然有一个问题。我希望它的工作方式是,我创建这个唯一的url并重定向客户端,然后在路由器功能中路由这个请求,在那里我将下载他们的文件。问题是:要路由这个“动态”url,我必须将它添加到我的url处理程序数组中,这是一个公共数组;因此,这个所谓的“唯一”url不再是唯一的。我如何将其保存为特定于客户端的url?许多网站只是通过模糊的url来实现这一点:当你购买一个url时,你会得到一个唯一的url,但没有任何东西阻止你将该url发送给其他人。为了增加一层安全性,你必须将它链接到一个用户帐户并进行身份验证(使用cookies)。好的,我想现在就必须这样做。我让它正常工作,但我可能会添加一个cookie检查,就像你说的那样,当我开始做的时候。谢谢你的帮助!