2

我正在使用 actix-web 创建一个嵌入了状态/数据的 httpserver。但是 vscode 告诉我 create_app 函数在其返回值类型定义“App< AppState >”中有错误的参数:

发布结构应用

类型参数数量错误:预期 2,找到 1

预期 2 类型参数rustc(E0107)

应用程序.rs:

use crate::api;
use crate::model::DbExecutor;
use actix::prelude::Addr;
use actix_web::{error, http::Method, middleware::Logger, web, App, HttpResponse};

pub struct AppState {
pub db: Addr<DbExecutor>,
}

pub fn create_app(db: Addr<DbExecutor>) -> App<AppState> {
    App::new().data(AppState { db }).service(
        web::resource("/notes/").route(web::get().to(api::notes))
    );
}

main.rs:

fn main(){
    HttpServer::new(move || app::create_app(addr.clone()))
        .bind("127.0.0.1:3000").expect("Can not bind to '127.0.0.1:3000'").start();
}

由于“服务”方法的返回类型是“Self”,即 actix_web::App 类型,我尝试将返回类型修改为 App(不带泛型参数)但仍然出现错误,我该怎么办?

4

1 回答 1

4

首先,App接受两个泛型类型参数 ,App<AppEntry, Body>您只给出了一个。

第二,AppState不是AppEntry

第三,App在 actix-web 外部实例化很困难,如果不是不可能的话,因为您需要从 actix-web 获得的类型不是公开的。

相反,您应该使用configure来实现相同的目的,这是一个简化的示例:

use actix_web::web::{Data, ServiceConfig};
use actix_web::{web, App, HttpResponse, HttpServer};

fn main() {
    let db = String::from("simplified example");

    HttpServer::new(move || App::new().configure(config_app(db.clone())))
        .bind("127.0.0.1:3000")
        .expect("Can not bind to '127.0.0.1:3000'")
        .run()
        .unwrap();
}

fn config_app(db: String) -> Box<Fn(&mut ServiceConfig)> {
    Box::new(move |cfg: &mut ServiceConfig| {
        cfg.data(db.clone())
            .service(web::resource("/notes").route(web::get().to(notes)));
    })
}

fn notes(db: Data<String>) -> HttpResponse {
    HttpResponse::Ok().body(["notes from ", &db].concat())
}

ServiceConfigapi 文档中阅读更多信息。

于 2019-09-22T20:28:51.677 回答