Javascript 通过https建立SSE连接失败-如何解决
据我所知,要建立一个事件流,必须在客户机上创建一个事件源对象,将端点传递给服务器,以便向其注册。服务器在收到此请求时,会适当地设置响应头,并按照事件流格式发送数据。我已经设置了这个流,它通过http工作,但是在向服务器添加SSL之后,事件流被创建,服务器抛出一个501-未实现的错误。经过一些研究,我认为这可能是一个CORS问题,并添加了适当的标题,但这也没有什么区别。我还尝试了一些小的修复,这些修复通常适用于501个错误,比如清除浏览器缓存和禁用任何代理设置。我对此完全感到困惑,如果有人能帮助我理解这个问题以及解决问题的最佳方法,我将不胜感激 编辑: 客户端通过aws elb负载平衡器向服务器发送请求,该负载平衡器从请求中剥离ssl并将请求转发给服务器。除了CORS相关问题外,服务器抛出501错误的另一个可能原因是请求被更改 负载平衡器在将请求转发到服务器之前从请求中删除SSL时,是否可能以某种方式更改sse请求,从而导致服务器抛出错误?如何监控进入负载平衡器的请求和转发的请求? 此外,经过进一步研究,我了解到服务器端事件本质上是HTTP流的一种形式。即使在发送数据之后,请求仍保持打开状态,直到客户端显式关闭为止。考虑到我的第一个预感是错误的,SSL被剥离并转发到服务器,而不改变请求,服务器发送响应头和心跳信号以保持连接活动 这是否意味着流也被加密了?Javascript 通过https建立SSE连接失败-如何解决,javascript,node.js,server-sent-events,Javascript,Node.js,Server Sent Events,据我所知,要建立一个事件流,必须在客户机上创建一个事件源对象,将端点传递给服务器,以便向其注册。服务器在收到此请求时,会适当地设置响应头,并按照事件流格式发送数据。我已经设置了这个流,它通过http工作,但是在向服务器添加SSL之后,事件流被创建,服务器抛出一个501-未实现的错误。经过一些研究,我认为这可能是一个CORS问题,并添加了适当的标题,但这也没有什么区别。我还尝试了一些小的修复,这些修复通常适用于501个错误,比如清除浏览器缓存和禁用任何代理设置。我对此完全感到困惑,如果有人能帮助我
服务器是用膝关节炎来写的。以下是sse注册端点的外观:您应该设置headers res.setHeader('Access-Control-Allow-Origin',Origin');res.setHeader('Access-Control-Allow-Credentials','true');这是什么?如果一个答案只是一大块没有解释的代码(并且代码中没有描述性注释),那么它会让很多人感到困惑,如果你对OP的问题进行解释,那么它总是一个更好的答案。
// node.js
const SseStream = require('ssestream');
console.log('SseStream', SseStream)
const MyService = {
doSomeStuff: () => {return 222}
}
public async someFunctionInRouter(req,res) {
const origin = req.get('origin') || '';
const sseStream = new SseStream(req);
res.setHeader('Access-Control-Allow-Origin', origin);
res.setHeader('Access-Control-Allow-Credentials', 'true');
res.on('end', () => {
console.log("res.on('end'");
});
res.on('close', () => {
console.log("res.on('close'");
sseStream.unpipe(res);
});
res.on('error', ee => {
console.log("res.on('error'", ee);
sseStream.write({
id: 3,
event: 'myCustomEvent',
data: {
errors: [ee]
}
});
});
sseStream.pipe(res);
const result = await MyService.doSomeStuff(999, 888)
.catch(e => {
console.error('error', e);
sseStream.write({
id: 2,
event: 'myCustomEvent',
data: {
errors: [e]
}
});
});
sseStream.on('end', (eeee: any) => {
console.log('sseStream.on error', eeee);
});
sseStream.on('error', (eeee: any) => {
console.log('sseStream.on error', eeee);
});
sseStream.on('close', (eeee: any) => {
console.log('sseStream.on close', eeee);
});
sseStream.write({
id: 1,
event: 'myCustomEvent',
data: result
});
res.end();
}