为了账号安全,请及时绑定邮箱和手机立即绑定

未为 eventSource 触发 onmessage 函数

未为 eventSource 触发 onmessage 函数

慕斯王 2022-01-20 20:28:37
我使用 express 模块在 node.js 中创建了一个服务器。它公开了一个 get api,用于通过始终保持活动状态的打开连接定期向客户端发送事件。const cors = require('cors');const app = express();app.use(cors());const port = 3001;app.get('/sse-server', function (request, response) {    response.status(200).set({        "connection": "keep-alive",        "cache-control": "no-cache",        "content-Type": "text/event-stream"    });    let data = { name: "Mithoon Kumar"}    setInterval(()=>{ response.write(JSON.stringify(data));}, 0)})app.listen(port, () => console.log(`Example app listening on port ${port}!`))我还在 node.js 中创建了一个客户端,它使用 eventsource 来接收服务器发送的事件console.log("EventSource", EventSource);const eventSource = new EventSource('http://127.0.0.1:3001/sse-server');eventSource.onopen = (event) => {   console.log("event", event);};eventSource.onerror = (error) => {    console.log("error", error);}eventSource.onmessage = (message) => {    console.log("message", message);}问题是永远不会触发 onmessage 方法。如果我在 chrome 浏览器中打开链接(http://127.0.0.1:3001/sse-server ),它会在页面上显示消息。
查看完整描述

2 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

显然,EventSource只能使用其文档中定义的特定格式。正如您在此示例中看到的,消息数据应以某种data: [YOUR_DATA]\n\n格式发送。


你应该在你的服务器端使用这样的东西:


app.get('/event-stream', (req, res) => {    

    res.status(200).set({

        "connection": "keep-alive",

        "cache-control": "no-cache",

        "content-Type": "text/event-stream"

    });


    let data = { name: "Mithoon Kumar" }

    const intervalId = setInterval(() => {

        res.write(`data: ${JSON.stringify(data)}\n\n`);

    }, 1000);


    req.on('close', () => {

        clearInterval(intervalId);

    });

});


查看完整回答
反对 回复 2022-01-20
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

我编辑了服务器正在写入数据的行并开始工作。setInterval(()=>{ response.write( data: Hello world!\n\n)}, 0)


查看完整回答
反对 回复 2022-01-20
  • 2 回答
  • 0 关注
  • 715 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信