我创建了一个路由/stream,该路由应每秒推送一次字符串“ test”。

当我在Chrome上打开此URL(localhost:12346/stream)时,它的确打开了一个空白页面,并且每秒都会在页面上附加一个“测试”,因此我认为服务器端可以正常工作。当我在Firefox上打开它时,它将其视为永远不会完成的文件下载。

但是,当我在下面打开client.html时,从未触发EventSource对象的onmessage事件,因此我没有任何数据。 onopen事件被触发,我在控制台中看到它。为什么是这样?如何在JavaScript端接收数据?

server.py:

import flask
import flask_cors
import time

app = flask.Flask(__name__)
app.debug = True
flask_cors.CORS(app)

def event_stream():
    while True:
        time.sleep(1)
        yield 'test\n'

@app.route('/stream')
def stream():
    return flask.Response(event_stream(), mimetype='text/event-stream')

app.run(port=12346, threaded=True)


client.html:

<!DOCTYPE html>
<html>
  <body>
    <script>
        var source = new EventSource('http://localhost:12346/stream');
        source.onopen = e => console.log('opened', event);
        source.onerror = e => console.log('error', event);
        source.onmessage = e => console.log('onmessage', event);
    </script>
  </body>
</html>

最佳答案

Server sent event EventStream does not trigger "onmessage" but Chrome Debug shows data in "EventStream" tab

解决了我的问题,后端发送的事件具有自定义类型,而不会触发onmessage回调

10-06 02:02