使用Node.js(express)进行服务器发送事件/事件源

8
我正在尝试使用SSE将JSON数据发送到浏览器,但似乎做不对,也不知道为什么。
服务器端代码如下:
var express     = require("express"),
    app         = express(),
    bodyParser  = require('body-parser');

app.use(express.static(__dirname + '/'));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var testdata = "This is my message";

app.get('/connect', function(req, res){
    res.writeHead(200, {
      'Connection': 'keep-alive',
      'Content-Type': 'text/event-stream',
      'Cache-Control': 'no-cache'
    });

    setInterval(function(){
      console.log('writing ' + testdata);
      res.write('data: {"msg": '+ testdata +'}\n\n');
    }, 1000);
});

/*
app.post('/message', function(req, res) {
  testdata = req.body;
});
*/

var port = 8080;
app.listen(port, function() {
  console.log("Running at Port " + port);
});

正文:如您所见,我已经注释掉了帖子的内容,但是最终我想要像这样使用testdata作为JSON本身:
res.write('data: ' + testdata + '\n\n');

客户端的样子是这样的:
<script>
    var source = new EventSource('/connect');
    source.onmessage = function(e) {
        var jsonData = JSON.parse(e.data);
        alert("My message: " + jsonData.msg);
    };
</script>

我看到了控制台日志,但没有看到警报。

我已经解决了我的另一个问题,这里可以查看完整的代码:http://stackoverflow.com/questions/31653481/how-do-i-modify-the-page-im-serving-in-node-js - Timppe
我只是在寻找像这样的一个示例,非常有用! - Manjar
1个回答

10
尝试发送正确的JSON(在输出中,testdata没有引号):
res.write('data: {"msg": "'+ testdata +'"}\n\n');

但最好的情况是:
res.write('data: ' + JSON.stringify({ msg : testdata }) + '\n\n');

我曾经引用过它,但那时可能还有其他故障 :) 谢谢!现在我可以正常接收我的消息和更大的JSON了。 - Timppe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接