未为 eventSource 触发 onmessage 函数

我使用 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 ),它会在页面上显示消息。


慕斯王
浏览 716回答 2
2回答

天涯尽头无女友

显然,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);    });});

慕莱坞森

我编辑了服务器正在写入数据的行并开始工作。setInterval(()=>{ response.write( data: Hello world!\n\n)}, 0)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript