如何发送' text / event-stream'来自express.js的数据?

时间:2018-01-16 22:22:21

标签: javascript node.js express server-sent-events

尝试在服务器端使用express.js获取基本的服务器发送事件:

index.js

const app        = require('express')();
const index_html = require('path').join(__dirname, 'index.html');

app.get('/', (req, res) =>
{
    res.sendFile(index_html);
});

app.get('/data', (req, res) =>
{
    res.header('Cache-Control', 'no-cache');
    res.header('Content-Type', 'text/event-stream');

    setInterval(() =>
    {
        res.write(new Date().toISOString() + '\n\n');
    }, 1000);
});

app.listen('7000');

index.html

<!doctype html>
<head>
    <title>Hello World</title>
</head>
<body>
    <h1 id='result'>No Data Yet</h1>
    <script>
    var source = new EventSource('data');
    source.onmessage = function(event)
    {
        console.log('invoked');
        document.getElementById('result').innerHTML = event.data + '<br>';
    };
    </script>
</body>

source.onmessage永远不会触发。

1 个答案:

答案 0 :(得分:2)

服务器端事件需要以特定(文本)格式发送数据,具体来说,要发送数据,需要格式化的文本行

data: text to send goes here

单个活动中的其他类型的数据可以是typeidretry

任何不以

开头的行
data:
type:
id:
retry:

被忽略,因此您没有收到任何事件

简单的改变

setInterval(() =>
{
    res.write('data: ' + new Date().toISOString() + '\n\n');
}, 1000);

虽然,我会像

一样写
    setInterval(() => res.write(`data: ${new Date().toISOString()}\n\n`), 1000);
  

进一步阅读MDN documentation