You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:57:02