【问题标题】:Sending an http response outside of the route function?在路由功能之外发送http响应?
【发布时间】:2012-11-11 07:47:39
【问题描述】:

所以,我有一个如下的路由函数:

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
    }

}

当调用套接字事件“事件”时,我想执行如下的 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'对象.我该怎么做呢?谢谢。

【问题讨论】:

    标签: node.js socket.io httpresponse


    【解决方案1】:

    嗯……有趣的问题:

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

      1. 接收http请求,不响应,将res对象保存在某处。
      2. 接收 websocket 请求,执行您的身份验证/“链接”到之前保存的 res 对象。
      3. 通过res回复文件。
    • 但它不是很漂亮有几个原因:

      1. 您需要保存 res 对象,如果您的服务器重新启动,则会丢失一大堆响应对象。
      2. 您需要弄清楚如何将 websocket 客户端链接到 http 请求客户端。我认为,您可以使用 cookie/localstorage 来执行此操作。
      3. 扩展到另一台服务器将变得更加困难/您是否会代理客户端始终由同一台服务器提供服务?否则链接会变得更难。

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

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

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

    【讨论】:

    • 嗯,我肯定更倾向于使用第二种解决方案(由于简单性和兼容性),但我仍然遇到问题。我希望它如何工作是我创建这个唯一的 url 并重定向客户端,然后在我将下载他们的文件的路由器功能中路由这个请求。问题:要路由这个'on-the-fly' url,我必须将它添加到我的 url 处理程序数组中,这是一个公共数组;因此,这个所谓的“唯一” url 不再是唯一的。我如何将其保存为客户特定的 url?
    • 很多网站只是通过晦涩的 URL 来做到这一点:当您购买 humble indie bundle 时,您会获得一个唯一的 URL,但没有什么能阻止您将该 URL 发送给其他人。要添加一层安全性,您必须将其链接到用户帐户并进行身份验证(使用 cookie)。
    • 好吧,我想现在必须这样做。我让它正常工作,但是当我开始使用它时,我可能会添加一个 cookie 检查,正如你所说的。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2018-01-21
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    相关资源
    最近更新 更多