我创建了一个路由/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回调