< 返回版块

WorldLink 发表于 2020-12-13 23:19

Tags:async_std,tide

tide 的路由是这样注册的

use tide::{
    Request,
    prelude::*,
};

#[async_std::main]
async fn main() -> tide::Result<()> {
    let mut app = tide::new();

    // let core = Core {};
    app.at("/orders/shoes").post(core);
    // app.at("/orders/shoes").post(Core::order_shoes);
    app.listen("127.0.0.1:8080").await?;
    Ok(())
}

.post接受的参数为 impl Endpoint<State>

/// Add an endpoint for `POST` requests
    pub fn post(&mut self, ep: impl Endpoint<State>) -> &mut Self {
        self.method(http_types::Method::Post, ep);
        self
    }

官方示例是这样的

    async fn order_shoes(mut req: Request<()>) -> tide::Result {
        let Animal { name, legs } = req.body_json().await?;
        Ok(format!("Hello, {}! I've put in an order for {} shoes", name, legs).into())
    }
    
   
    app.at("/路径").get(order_shoes);  

因为Fn实现了

#[async_trait]
impl<State, F, Fut, Res> Endpoint<State> for F
where
    State: Clone + Send + Sync + 'static,
    F: Send + Sync + 'static + Fn(Request<State>) -> Fut,
    Fut: Future<Output = Result<Res>> + Send + 'static,
    Res: Into<Response> + 'static,
{
    async fn call(&self, req: Request<State>) -> crate::Result {
        let fut = (self)(req);
        let res = fut.await?;
        Ok(res.into())
    }
}

我想用Self的一些变量 于是如此的写

impl Core {


    async fn order_shoes_test1(&self, mut req: Request<()>) -> tide::Result {
        // self 我想用self的一些变量
        let Animal { name, legs } = req.body_json().await?;
        Ok(format!("Hello, {}! I've put in an order for {} shoes", name, legs).into())
    }

    async fn order_shoes_test2(&self) -> fn(Request<()>) -> tide::Result {
        
        // 我想用self的一些变量
        async move |mut req: Request<()>| -> tide::Result {
            let Animal { name, legs } = req.body_json().await?;
            Ok(format!("Hello, {}! I've put in an order for {} shoes", name, legs).into())
        }
    }
}

第一个order_shoes_test1 报这样的错 (好像是现代rust没有实现异步闭包带参数???)

error[E0615]: attempted to take value of method `order_shoes_test1` on type `Core`
  --> src/main.rs:17:39
   |
17 |     app.at("/orders/shoes").post(core.order_shoes_test1);
   |                                       ^^^^^^^^^^^^^^^^^ method, not a field

第二个 order_shoes_test2 这样的错

  --> src/main.rs:43:9
   |
43 |         async move |mut req: Request<()>| -> tide::Result {
   |         ^^^^^
   |
   = note: see issue #62290 <https://github.com/rust-lang/rust/issues/62290> for more information

error[E0308]: mismatched types
  --> src/main.rs:43:9
   |
43 |         async move |mut req: Request<()>| -> tide::Result {
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `std::result::Result`, found opaque type
   | 
  ::: /home/github/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/future/mod.rs:61:43
   |
61 | pub const fn from_generator<T>(gen: T) -> impl Future<Output = T::Return>
   |                                           ------------------------------- the found opaque type
   |
   = note:     expected enum `std::result::Result<tide::Response, tide::Error>`
           found opaque type `impl Future`

error[E0615]: attempted to take value of method `order_shoes_test2` on type `Core`
  --> src/main.rs:17:39
   |
17 |     app.at("/orders/shoes").post(core.order_shoes_test2);
   |                                       ^^^^^^^^^^^^^^^^^ method, not a field

请问一下 我想 .get() 这个http func 我想在里面使用一个他父级 self的变量改怎么办? 比如下面的http func 想使用user 自己的db

struct user {
   db: HashMap<String,Int>, 
}

impl user {
   async func http_func(&self,mut req: Request<()>) -> tide::Result {
    // 这里要使用self 的db变量 或者其他  
   }
}

评论区

写评论
作者 WorldLink 2020-12-14 11:07

谢谢答复

作者 WorldLink 2020-12-14 11:07

谢谢答复 我想在它上层封装一个 类似Koa洋葱的中间件 用AppState感觉有的别扭

作者 WorldLink 2020-12-14 11:05
struct Core {}

#[async_trait]
impl<State: Clone + Send + Sync + 'static> Endpoint<State> for Core {
    async fn call(&self, req: Request<State>) -> Result<Response> {
        Ok(format!("Hello World").into())
    }
}

我去实现它的trait就可以了

ruby 2020-12-14 10:30

我想用self的一些变量

tide官方建议全局的可变或者不可变的变量都放到AppState里面,我不建议你把这些路由方法包成实例方法

whfuyn 2020-12-14 10:17

试试Core::order_shoes_test1。 另外,async的函数返回的是Futureorder_shoes_test2的返回值的返回值类型要改一下,试试Box<dyn Future<Output = tide::Result>

1 共 5 条评论, 1 页