我目前正在为我的聊天应用程序开发两个 Node.js 应用程序:第一个是处理后端逻辑的 API,另一个应用程序是使用 API 的客户端(带有 Angular.JS 的前端)。
客户端应用程序正在使用请求模块将 HTTP 请求代理到 API,因为在我找到这篇文章之前我无法让它们相互通信:https ://blog.javascripting.com/2015/01/17/dont-hassle-with -cors/。
API(订阅事件流):
var clientId = 0;
var clients = {};
app.get('/api/xyz', function(req, res) {
console.log('start');
req.socket.setTimeout(0x7FFFFFFF);
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
res.write('\n');
(function(clientId) {
clients[clientId] = res;
req.on('close', function() {
console.log('close');
delete clients[clientId];
});
})(++clientId);
});
API 代码正在运行,当客户端调用方法 /api/xyz 时,我在 API 的日志中看到“开始”。
客户端(对 API 的代理 HTTP 请求):
app.use('/api', function(req, res) {
req.on('close', function() {
console.log('close');
});
var url = "http://localhost:8080/api" + req.url;
req.pipe(request(url)).pipe(res);
});
客户端代码也运行良好。当浏览器选项卡关闭时,我在客户端应用程序的日志中看到“关闭”。
然而,问题是当我关闭浏览器选项卡时,我在 API 的日志中看不到“关闭”。连接永远不会在 API 上关闭,因为在 API 端永远不会检测到关闭事件。
有谁知道为什么?