0

我的hyper服务器设置或多或少与此处的第三个示例完全相同:https ://docs.rs/hyper/0.14.16/hyper/server/index.html 。我的handle函数版本调用了其他一些async函数,一切正常,直到我尝试将一些 URL 查询参数编码为其中一个异步函数中的字符串。Serializer当我在调用的函数之一中包含涉及 的四行时,我的项目停止编译handle

async fn broken_func(&self, param: &str) -> Result<String, Infallible> {
    // ...
    
    let mut s = url::form_urlencoded::Serializer::new(String::new());
    
    // the presence or absence of these two lines has no effect on the bug, but
    // they demonstrate how I'm trying to use the Serializer
    s.append_pair("key", "value");
    println!("{:?}", s.finish());
    
    drop(s); // <-- thought this might help, but it doesn't
    
    // ...
    Ok(query_string)
}

我得到的错误是

generator cannot be sent between threads safely
the trait `std::marker::Sync` is not implemented for `dyn for<'r> std::ops::Fn(&'r str) -> std::borrow::Cow<'_, [u8]>`

我不知道这有什么关系form_urlencoded::Serializer。但是,我知道Serializer两者都是!Sendand !Sync,但在这种情况下,我只在一个函数中使用它,所以我认为这不会有什么不同吗?如果我删除上面的那四行,它会回到编译。

因此,为了将一些键/值对序列化为 URL 查询参数,我必须使用以下内容,这看起来很荒谬——不仅因为这对于如此简单的事情来说是不必要的复杂,而且还因为在后台url::Url::parse_with_params使用form_urlencoded::Serializer

let query_string = url::Url::parse_with_params(
        "http://example.com", 
        &[("key", "value")]
    )
    .unwrap()
    .query()
    .map(|s| s.to_owned())
    .unwrap();

知道为什么尝试在函数Serializer内部显式使用async会导致事情中断吗?

4

1 回答 1

-1

凯撒一针见血。放入范围的技巧s修复了它。

于 2022-01-18T13:31:25.973 回答