当前位置: 首页 > 知识库问答 >
问题:

为什么onmail侦听器不处理初始SSE事件?

呼延骏俊
2023-03-14

在本例中,客户端通过创建新的EventSource连接到Node Express服务器。服务器在初始连接时发送SSE事件,然后每隔30秒发送一次。问题是客户端的onmessage处理程序不是由连接时发送的初始SSE事件触发的,而是由所有后续事件触发的。如果我在建立连接后立即停止服务器,这实际上会在客户端中触发一个事件,表明数据实际上是在片刻之前没有处理的情况下收到的(或者初始res.write仅在服务器关闭时触发):

服务器:

let data = {mydata: 123};

function eventsHandler(req, res, next) {

  const headers = {
    "Content-Type": "text/event-stream",
    Connection: "keep-alive",
    "Cache-Control": "no-cache",
  };

  res.writeHead(200, headers);
  // After client opens connection we send data string, but client doesn't handle this correctly
  // Event is only triggered on client if I stop the server after sending this message
  res.write(`data: ${JSON.stringify(data)}\n\n`);
  console.log("sent SSE");

  const clientId = Date.now();
  console.log(clientId, " connected");
  const newClient = {
    id: clientId,
    res,
  };
  clients.push(newClient);

  req.on("close", () => {
    console.log(`${clientId} Connection closed`);
    clients = clients.filter((c) => c.id !== clientId);
  });
}

// these events are received and handled correctly on client
function sendEventsToAll(datadict) {
  clients.forEach((c) => c.res.write(`data: ${JSON.stringify(datadict)}\n\n`));
}

// Route to open SSE connection
app.get("/events", eventsHandler);

// Loop to send SSE every 30 seconds - these are all received and handled correctly
async function wait() {
  sendEventsToAll(data);
  setTimeout(wait, 30000);
}

wait();

浏览器:

      const events = new EventSource(url)

      // This handles every SSE event except the one that is written immediately upon connection
      // If I stop the server after connection, this will trigger and reveal the data was received but not handled
      events.onmessage = event => {
        const newData = JSON.parse(event.data)
        console.log("newData", newData)
      }

编辑:我还应该补充一点,我正在使用nginx作为反向代理-这会不会因为某种原因而缓冲第一个res.write而不是立即发送它?

共有1个答案

邢飞白
2023-03-14

这是由nginx中的proxy\u缓冲造成的,该缓冲默认为“开”。

在nginx配置中关闭此选项解决了问题:

server {
# server config here...

   location / {
   # proxy config here...
   proxy_buffering off; # resolves issue
   }

}
 类似资料:
  • 女士们先生们晚上好, 我有一个Java Swing的问题,我无法解决,也许你可以帮助我。在这里: 我有一个使用BorderLayout的JFrame和许多JPanel 每次我需要设置一个新屏幕(即,从主菜单,当单击搜索按钮时,转到搜索菜单),我只需删除位于中心的组件(JPanel),并将新屏幕(新JPanel)放在中心 这样,我不会在每次我想显示新屏幕时调用所有的页眉和页脚对象 这个系统一切正常,

  • 在致力于提高渐进式web应用程序的性能时,我遇到了一个新功能,我发现很难理解这个概念。 什么是被动事件侦听器,在我们的项目中需要它吗?

  • 我有两个屏幕..首先是闪屏,在这里我借助firebase.auth()检查用户是否已经存在。onAuthStateChanged侦听器。如果用户为空,它将转到另一个firebase.auth()的登录屏幕。onAuthStateChanged侦听器用于在电话验证后获取用户,如果用户之前未注册,则将用户移至UserDetails屏幕以获取更多用户信息,或者移至主屏幕..同样的检查也在闪屏上进行,以确

  • 问题内容: 我目前正在研究Socket.io的Java实现,可从此处获取:netty- socketio 我已经启动并运行了服务器,并且它在客户端和服务器之间很好地接收/发送消息,但是我需要让某些消息被接收时触发事件,这就是我的困惑。 这是我的代码: } 本质上,我想发生的是从客户端收到特定消息时,我需要另一个类中的函数才能运行。我花了持续两个小时阅读,,和事件处理程序,但我真的不知道如何处理此问

  • 我尝试将在Apache Camel处理器中处理的数据推送到侦听器类。在处理器类实例中,我尝试在Camel上下文的实例化期间注册侦听器,但不知何故失败了。也许我在这里根本错误,这是不可能的。如果是这种情况,最好你告诉我。 我有一个Apache Camel路由,从ActiveMQ服务器获取JSON消息,并将这些JSON推送到一个自定义处理器类,该类由Camel-Spring XML定义: 我的想法是,

  • 问题内容: 我开始全新复制WSO2 API Manager 1.8,并无缘无故出现以下错误。 我怎样才能解决这个问题? 问题答案: 通过运行以下命令检查系统主机名 尝试ping到该主机名的输出。 如果那给出了错误,请检查文件。至少它应该具有主机条目127.0.0.1