Rust升级tokio和warp后UnboundedReceiver调用forward报trait bounds不满足错误
错误根因
报错的核心原因是 Tokio 1.x 版本中,tokio::sync::mpsc::UnboundedReceiver 不再默认实现 futures::Stream 特征,而你调用的forward方法是StreamExt特征提供的,要求调用者必须实现Stream特征才能正常使用。
解决方案
- 新增
tokio-stream依赖,该库提供了Tokio内置同步类型到Stream特征的适配包装。在Cargo.toml的依赖块中添加:
tokio-stream = { version = "0.1", features = ["sync"] }
- 在代码顶部导入所需的特征和包装类型:
use tokio_stream::wrappers::UnboundedReceiverStream; use futures::StreamExt;
- 修改原代码,将
UnboundedReceiver包装为Stream类型后再调用forward方法:
let (client_ws_sender, mut client_ws_rcv) = ws.split(); let (client_sender, client_rcv) = mpsc::unbounded_channel(); // 把接收器包装为实现Stream特征的类型 let client_rcv_stream = UnboundedReceiverStream::new(client_rcv); tokio::task::spawn(client_rcv_stream.forward(client_ws_sender).map(|result| { if let Err(e) = result { eprintln!("error sending websocket msg: {}", e); } }));
可选适配
如果你的futures依赖设置了default-features = false后仍提示找不到StreamExt特征,可以给futures添加std特征:
futures = { version = "0.3", default-features = false, features = ["std"] }
内容的提问来源于stack exchange,提问作者Hasan Parasteh
相关产品推荐
相关产品推荐

