在本例中,客户端通过创建新的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而不是立即发送它?
这是由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