出错描述
import { fetchEventSource } from "@microsoft/fetch-event-source"
客户端发送请求后,使用的fetchEventSource
的onmessage
回调函数不触发,根本就拿不到数据,但是onopen
函数可以正常执行。
我先是在最原始的fetch
上测试成功,前后端能够顺利流式输出。然后想升级到EventSource
(因为EventSource
提供signal
,可以随时中断请求)。
在出错时,后端返回数据的代码如下:
for new_text in streamer:
json_object = json.dumps({"data": new_text})
yield f"{json_object}\n"
出错原因
我们都知道SSE
是一种服务器持续推送消息给客户端的技术,因此客户端每拿到一点数据后需要去处理,而SSE
规定了schema
,不照着写前端是不可以取这些数据的。
SSE
规定的schema
:
event: message\n
data: {你的数据}\n\n
【注意】以上是纯字符串。
message
也可以是其他,不影响onmessage
回调函数。
解决方案
把你真正要返回的数据,嵌套一下。我是用Python
写的,其他语言都行,注意换行符就行了:
for new_text instreamer:
json_object = json.dumps({"data": new_text})
yield f"event: message\ndata: "+json_object+"\n\n"
原理分析
在fetchEventSource
的onmessage
回调函数里打印参数:
onmessage: (event) => {
console.log(event)
}
会发现你传的参数,会自动被转成JSON,此时event
的值就是message
。