Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过https建立SSE连接失败-如何解决_Javascript_Node.js_Server Sent Events - Fatal编程技术网

Javascript 通过https建立SSE连接失败-如何解决

Javascript 通过https建立SSE连接失败-如何解决,javascript,node.js,server-sent-events,Javascript,Node.js,Server Sent Events,据我所知,要建立一个事件流,必须在客户机上创建一个事件源对象,将端点传递给服务器,以便向其注册。服务器在收到此请求时,会适当地设置响应头,并按照事件流格式发送数据。我已经设置了这个流,它通过http工作,但是在向服务器添加SSL之后,事件流被创建,服务器抛出一个501-未实现的错误。经过一些研究,我认为这可能是一个CORS问题,并添加了适当的标题,但这也没有什么区别。我还尝试了一些小的修复,这些修复通常适用于501个错误,比如清除浏览器缓存和禁用任何代理设置。我对此完全感到困惑,如果有人能帮助我

据我所知,要建立一个事件流,必须在客户机上创建一个事件源对象,将端点传递给服务器,以便向其注册。服务器在收到此请求时,会适当地设置响应头,并按照事件流格式发送数据。我已经设置了这个流,它通过http工作,但是在向服务器添加SSL之后,事件流被创建,服务器抛出一个501-未实现的错误。经过一些研究,我认为这可能是一个CORS问题,并添加了适当的标题,但这也没有什么区别。我还尝试了一些小的修复,这些修复通常适用于501个错误,比如清除浏览器缓存和禁用任何代理设置。我对此完全感到困惑,如果有人能帮助我理解这个问题以及解决问题的最佳方法,我将不胜感激

编辑:

客户端通过aws elb负载平衡器向服务器发送请求,该负载平衡器从请求中剥离ssl并将请求转发给服务器。除了CORS相关问题外,服务器抛出501错误的另一个可能原因是请求被更改

负载平衡器在将请求转发到服务器之前从请求中删除SSL时,是否可能以某种方式更改sse请求,从而导致服务器抛出错误?如何监控进入负载平衡器的请求和转发的请求? 此外,经过进一步研究,我了解到服务器端事件本质上是HTTP流的一种形式。即使在发送数据之后,请求仍保持打开状态,直到客户端显式关闭为止。考虑到我的第一个预感是错误的,SSL被剥离并转发到服务器,而不改变请求,服务器发送响应头和心跳信号以保持连接活动

这是否意味着流也被加密了?
服务器是用膝关节炎来写的。以下是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();
  }