reactjs - SpringBoot + WebFlux + Reactjs Server Sent Events onmessage not fire up
问题描述
我在网络上看到 EventStream,但我的 clientSource.onmessage 没有在客户端上启动。我没有找到很多将 WebFlux 功能端点用于 SSE 的示例。我究竟做错了什么?
/sseget 是我的 SSE 端点的路由器:
@Component
class PersonRouter {
@Bean
fun personRoutes(personRouteHandler: PersonRouteHandler) = coRouter {
"/person".nest {
GET("/", personRouteHandler::getTest)
// GET("findById", accept(MediaType.APPLICATION_JSON), personRouteHandler::)
GET("paramstest", accept(MediaType.APPLICATION_JSON), personRouteHandler::paramsTest)
POST("posttest", accept(MediaType.APPLICATION_JSON), personRouteHandler::postTest)
}
"/sse".nest {
GET("/sseget", personRouteHandler::sseGet)
}
}
}
处理程序:
suspend fun sseGet(request: ServerRequest): ServerResponse {
val result = Flux.interval(Duration.ofSeconds(3))
.map{
ServerSentEvent.builder<String>()
.id(it.toString())
.event("periodic-event")
.data("SSE - " + LocalTime.now())
.comment("nejaky comment")
.retry(Duration.ofSeconds(10))
.build()
}
return ServerResponse
.ok()
.body(BodyInserters.fromServerSentEvents(result)).awaitSingle()
}
ReactJs 客户端:
const ServerSideEventExample: React.FC<IProps> = (props) => {
const [listening, setListening] = useState(false);
useEffect(() => {
let eventSource: EventSource | undefined = undefined;
debugger;
if (!listening) {
debugger;
eventSource = new EventSource("http://localhost:8085/sse/sseget");
eventSource.onopen = (event) => {
debugger;
console.log(event);
};
eventSource.onmessage = (event) => {
debugger;
console.log(event);
};
eventSource.onerror = (err) => {
debugger;
console.error("EventSource failed:", err);
};
setListening(true);
}
return () => {
if (eventSource) {
eventSource.close();
console.log("event closed");
}
};
}, []);
return <div>a</div>;
};
解决方案
将内容类型添加到您的服务器响应中,如下所示:
return ServerResponse
.ok()
.contentType(MediaType.TEXT_EVENT_STREAM)
.body(BodyInserters.fromServerSentEvents(result)).awaitSingle()
并记得将事件参数更改为“消息”如下
.id("Your ID")
.event("message") //<=== HERE
.data({your event here})
.comment("any comment")
.build();
推荐阅读
- sql - 对 DDL_DATABASE_LEVEL_EVENTS 使用触发器与列出特定事件类型是否有任何风险?
- docusignapi - 从模板中检索文档
- reactjs - 使用原生基础动态更改主题
- ios - URLSession 不遵循 ios 13 上的 302
- c# - 为什么使用四元数(vs Euler)设置旋转会导致极快的角速度?统一
- graphql - 如何在 GraphQL 中停止订阅?
- reactjs - 在没有输入字段的情况下将本地图像文件上传到 aws s3
- angular - 你如何在 Angular 中使用计算/计算的属性?
- node.js - 如何使用 Apple News API 自动发布内容?
- google-cloud-platform - 使用操作系统和数据磁盘从 GCP 虚拟机创建自定义映像