事件源未触发onmessage函数

时间:2019-12-03 10:28:02

标签: javascript node.js eventsource

我已经使用express模块​​在node.js中创建了一个服务器。它公开了一个get API,该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 个答案:

答案 0 :(得分:1)

显然,EventSource仅适用于其文档中定义的特定格式。如您在this example中所见,消息数据应以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);
    });
});

答案 1 :(得分:0)

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