Правильный тип возврата create_app

Я использую actix-web для создания http-сервера со встроенными в него состоянием / данными. Но vscode показывает мне, что функция create_app имеет неверные аргументы в определении типа возвращаемого значения «App‹ AppState> »:

pub struct приложение

неправильное количество аргументов типа: ожидается 2, найдено 1

ожидаемые 2 аргумента типа rustc (E0107)

app.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();
}

Поскольку возвращаемый тип метода «service» - «Self», который является типом actix_web :: App, я попытался изменить тип возвращаемого значения на App (без универсального параметра), но все равно получил ошибку, что мне делать?


person realjin    schedule 12.08.2019    source источник


Ответы (1)


Во-первых, 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())
}

Дополнительные сведения о ServiceConfig см. В документации по API .

person arve0    schedule 22.09.2019
comment
Это не совсем ответ на вопрос, не так ли? Ваш код в основном заменяет код в исходном вопросе, достигая того же. Но он не отвечает, почему возвращаемый тип App ‹AppState› не принимается / правильно. - person inzanez; 26.11.2019
comment
@inzanez обновил ответ, чтобы объяснить, почему возвращать App<AppState> неправильно, и отвечает, что мне делать? - person arve0; 04.12.2019