node.js - 在路由函数之外发送 http 响应?

标签 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. 接收http请求,不响应,将res对象保存在某处。
    2. 接收 websocket 请求,对其进行身份验证/“链接”到之前保存的 res 对象。
    3. 通过 res 响应文件。
  • 但是由于以下几个原因它不是很漂亮:

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

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

在此处检查此解决方案是否足以满足您的跨浏览器需求:http://caniuse.com/#feat=datauri

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

关于node.js - 在路由函数之外发送 http 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13326815/

相关文章:

spring - 在 Spring MVC 3.1 Controller 的处理程序方法中直接流到响应输出流

node.js - 使用 ECDH 和 nodejs 加密解密 secret

node.js - 如何确保Backbone和Express中的Restful路由安全?

node.js - 扩展 NodeJS 聊天室 - 在 Redis 中存储连接状态

Android HttpResponse 错误

c# - 新窗口中的 Http 响应对象

node.js - 在多个微服务上使用 Mongoose 模式

javascript - 如何检查授权 token 是否过期并强制注销?

node.js - 我可以通过 socket.emit 发送多少数据?

swift - socket.io连接成功后如何获取数据?