Open jiangxiaoqiang opened 1 year ago
I have defined a rust sse api:
use actix_web::{App, HttpResponse, HttpServer, Responder, post, get}; use rust_wheel::common::util::net::sse_stream::SseStream; use std::time::{Duration, SystemTime}; use tokio::{ sync::mpsc::{UnboundedReceiver, UnboundedSender}, task, }; #[get("/sse/producer")] pub async fn sse() -> impl Responder { let (tx, rx): (UnboundedSender<SSEMessage>, UnboundedReceiver<SSEMessage>) = tokio::sync::mpsc::unbounded_channel(); task::spawn(async move { for _ in 0..5 { let message:SSEMessage = SSEMessage::from_data(&"data11".to_string(),&"TEX_LOG".to_string()); tx.send(message).unwrap(); tokio::time::sleep(Duration::from_secs(1)).await; } }); let response = HttpResponse::Ok() .content_type("text/event-stream") .streaming(SseStream { receiver: Some(rx) }); response } #[actix_web::main] async fn main() -> Result<(), std::io::Error> { HttpServer::new(|| App::new().service(sse).service(sse)) .bind("127.0.0.1:8000")? .run() .await }
and this is my cargo.toml:
[package] name = "rust-learn" version = "0.1.0" edition = "2018" [dependencies] tokio = { version = "1.17.0", features = ["full"] } serde = { version = "1.0.64", features = ["derive"] } serde_json = "1.0.64" actix-web = "4" futures = "0.3" eventsource = "0.5" bytes = "1" reqwest = { version = "0.11.20", features = ["stream"] } tokio-stream = "0.1" rust_wheel = { git = "https://github.com/jiangxiaoqiang/rust_wheel.git", branch = "diesel2.0" } log4rs = "1.2.0" log = "0.4.0" actix-rt = "2.4.1" futures-util = "0.3.28"
using this code to receive the data:
import React from 'react'; import { EventSourcePolyfill } from 'event-source-polyfill'; const App: React.FC = () => { React.useEffect(() => { doLocal(); },[]); const doLocal = () => { let eventSource = new EventSourcePolyfill('/sse/producer'); eventSource.onopen = () => { } eventSource.onerror = (error:any) => { console.log(error) eventSource.close(); } eventSource.onmessage = (msg: any) => { console.log("origin polly:",msg) }; } } export default App;
could not fetch any data but when I replace it with native event source like this:
const doOrigin = () => { let eventSource = new EventSource('/sse/producer'); eventSource.onopen = () => { } eventSource.onerror = (error:any) => { console.log(error) eventSource.close(); } eventSource.onmessage = (msg: any) => { console.log("origin:",msg) }; }
it worked. why did this happen? Am I missing something?
I have defined a rust sse api:
and this is my cargo.toml:
using this code to receive the data:
could not fetch any data but when I replace it with native event source like this:
it worked. why did this happen? Am I missing something?