Rocket框架EventStream使用借用值时报Event不是trait错误如何解决
问题原因与解决方法
你遇到的报错是版本不匹配导致的语法误用,具体原因如下:
- 你参考的是Rocket 0.5正式版或更高RC版本的文档写法,但你当前使用的
0.5.0-rc.1版本中,Event是结构体类型而非trait,不能使用trait对象特有的类型 + 生命周期语法,这是编译器提示Event不是trait的直接原因。 0.5.0-rc.1版本的EventStream!宏指定生命周期的规则和后续版本不同,不需要在宏参数里写Event类型。
解决方法
直接将返回值的声明修改为EventStream!['_]即可,修改后的完整代码如下:
#[get("/my/stream")] pub fn my_stream(config: & State<config::Config>, _pool: &State<Pool<Sqlite>>) -> EventStream!['_] { EventStream! { let _test = config.database.clone(); let mut id = 0; let mut interval = time::interval(Duration::from_secs(1)); loop { yield Event::data("test data").event("test").id(id.to_string()); interval.tick().await; id += 1; } } }
这里的'_是Rust的匿名生命周期标记,会自动绑定函数输入参数的生命周期,允许你在EventStream的生成器内部借用config、_pool等函数入参。
可选优化
如果你不需要在SSE运行过程中动态读取配置的更新,也可以提前把需要用到的配置值从State里clone出来,不需要让stream持有参数借用,也就不需要额外标注生命周期。
内容的提问来源于stack exchange,提问作者Taztingo
相关产品推荐
相关产品推荐

