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变量 或者其他
}
}
1
共 5 条评论, 1 页
评论区
写评论谢谢答复
谢谢答复 我想在它上层封装一个 类似Koa洋葱的中间件 用AppState感觉有的别扭
我去实现它的trait就可以了
tide官方建议全局的可变或者不可变的变量都放到AppState里面,我不建议你把这些路由方法包成实例方法
试试
Core::order_shoes_test1
。 另外,async
的函数返回的是Future
,order_shoes_test2
的返回值的返回值类型要改一下,试试Box<dyn Future<Output = tide::Result>
。