如何将BroadcastStream<String>转换为BroadcastStream<sse::Event>?
将BroadcastStream转换为BroadcastStreamsse::Event的实现方法
要完成类型转换,核心是利用Rust Stream的map方法对流中元素做类型映射,具体实现步骤如下:
- 调整函数返回类型:把
sse_handler_as_string的返回值里的Result<String, BroadcastStreamRecvError>替换为Result<sse::Event, BroadcastStreamRecvError>,匹配最终要返回的SSE事件流类型。 - 用map转换流元素:遍历
BroadcastStream<String>的每个元素,将合法的字符串包装为SSE事件;错误则直接传递,无需额外处理。
修改后的完整函数代码
async fn sse_handler_as_string( State(app_state): State<Arc<AppState>>, ) -> Sse<impl Stream<Item = Result<Event, BroadcastStreamRecvError>>> { let rx = app_state.tx_as_string.subscribe(); let mystream = BroadcastStream::new(rx) // 核心转换逻辑 .map(|result| { result.map(|str_data| { Event::default().data(str_data) }) }); Sse::new(mystream).keep_alive(KeepAlive::default()) }
原理说明
BroadcastStream实现了Streamtrait,因此可以使用map这类流适配器修改元素类型。这里的逻辑是将每条字符串消息,封装成符合SSE规范的Event对象,让axum的Sse响应能正确序列化为浏览器可识别的SSE格式。
内容的提问来源于stack exchange,提问作者Fred Hors
相关产品推荐
相关产品推荐

