Rust actix_web :: main "ожидал` std :: result :: Result <(), std :: io :: Error> `из-за возвращаемого типа", но предлагаемый тип не работает - PullRequest
0 голосов
/ 06 августа 2020

Я новичок в ржавчине и начал экспериментировать с actix_web и sqlx. цель состоит в том, чтобы создать простой движок блога с открытым исходным кодом, но после того, как я реализовал синтаксический анализатор аргументов CLI и пул соединений basi c SQL, код больше не компилируется. Я получаю следующую ошибку:

error[E0308]: mismatched types
  --> src/main.rs:17:1
   |
17 | #[actix_web::main]
   | ^^^^^^^^^^^^^^^^^^
   | |
   | expected enum `std::result::Result`, found `()`
   | help: try using a variant of the expected enum: `Ok(#[actix_web::main])`
18 | async fn main() -> std::io::Result<()> {
   |                    ------------------- expected `std::result::Result<(), std::io::Error>` because of return type
   |
   = note:   expected enum `std::result::Result<(), std::io::Error>`
           found unit type `()`
   = note: this error originates in an attribute macro (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.
error: could not compile `rusty_read`.

To learn more, run the command again with --verbose.

ошибка предлагает использовать std::result::Result<(), std::io::Error> в качестве типа возврата, но я получаю ту же ошибку при замене им текущего типа возврата:

error[E0308]: mismatched types
  --> src/main.rs:17:1
   |
17 | #[actix_web::main]
   | ^^^^^^^^^^^^^^^^^^
   | |
   | expected enum `std::result::Result`, found `()`
   | help: try using a variant of the expected enum: `Ok(#[actix_web::main])`
18 | async fn main() -> std::result::Result<(), std::io::Error> {
   |                    --------------------------------------- expected `std::result::Result<(), std::io::Error>` because of return type
   |
   = note:   expected enum `std::result::Result<(), std::io::Error>`
           found unit type `()`
   = note: this error originates in an attribute macro (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.
error: could not compile `rusty_read`.

To learn more, run the command again with --verbose.

до сих пор я не мог найти никого с такой же проблемой и не мог найти для нее никаких причин.

Мой код:

/ Car go .toml

[package]
name = "rusty_read"
version = "0.1.0"
authors = ["LeMoonStar <webmaster@unitcore.de>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
actix-web = "3.0.0-beta.1"
rust-ini = "0.15"
sqlx = { version = "0.4.0-beta.1",  features = [ "all-databases", "any", "tls" ] }
clap = "2"

/ src / main.rs

use actix_web::{get, web, App, HttpServer, Responder};
use ini::Ini;
use sqlx::pool::Pool;
use sqlx::any;


#[get("/")]
async fn index() -> impl Responder {
    format!("index")
}

#[get("/article/{id}")]
async fn article(info: web::Path<u32>) -> impl Responder {
    format!("article nr.{}", info)
}

#[actix_web::main]
async fn main() -> std::result::Result<(), std::io::Error> {
    let conf = Ini::load_from_file("conf.ini").unwrap_or(Ini::load_from_str("[Server]
    bindAddress = \"127.0.0.1:8080\"
    
    [Database]
    url = \"mysql://user:password@localhost/blog\"
    ").unwrap());
    
    let matches = clap::App::new("Rusty Read")
        .version("0.1 INDEV")
        .author("LeMoonStar <webmaster@unitcore.de>")
        .about("a blog engine written in rust")
        .subcommand(clap::SubCommand::with_name("config")
            .about("sets various configurations for the blog")
            .arg(clap::Arg::with_name("address")
                .short("a")
                .long("adress")
                .help("sets the address the http server binds on (eg. 127.0.0.1:8080)")
                .takes_value(true))
            .arg(clap::Arg::with_name("database")
                .short("d")
                .long("database")
                .help("sets the url to the database (eg. mysql://user:password@localhost/blog)")
                .takes_value(true)))
        .subcommand(clap::SubCommand::with_name("init_database")
            .about("Initializes the database which is set in the conf.ini file (or with the config command)"))

        .get_matches();

    if let Some(matches) = matches.subcommand_matches("config") {
        if matches.is_present("address") {
            conf.section(Some("Server")).unwrap()
                .insert("bindAddress", "127.0.0.1:8080");
        }
        if matches.is_present("database") {
            conf.section(Some("Database")).unwrap()
                .insert("url", "mysql://user:password@localhost/blog");
        }
    } else if let Some(matches) = matches.subcommand_matches("init_database") {
        
    } else {
        let mut section = conf.section(Some("Server")).expect("conf.ini requires a [Server] section.");
        let bind_address = section.get("bindAddress").expect("conf.ini's [Server] section requires a bindAdress.");

        section = conf.section(Some("Database")).expect("conf.ini requires a [Database] section.");
        let db_url = section.get("url").expect("conf.ini's [Database] section requires a url.");

        let pool = Pool::<any::Any>::connect(db_url).await.expect("database connection pool could not be created.");

        HttpServer::new(move || {
            App::new()
                .service(article)
                .service(index)
                .data(pool.clone())
            })
            .bind(bind_address).expect("could not bind http server")
            .run()
            .await;
    }
}

Надеюсь, кто-нибудь сможет мне помочь с этой проблемой, так как я не могу продолжать работу над проектом, пока эта проблема присутствует.

1 Ответ

0 голосов
/ 07 августа 2020

Ok(()) на самом деле работает .. Я пытался скопировать весь ваш код раньше, и сделаю cargo check. У меня та же проблема, что и вы пишете в комментарии. затем я попытался очистить код внутри основной функции, а затем снова скопировать ваш код по частям. после добавления Ok(()) в качестве возврата из main. и ошибка изменилась еще до того, как я закончил копирование и вставку. см. снимок экрана с другой ошибкой на моем локальном компьютере.

затем я попытался исправить это, добавив clone(), как показано ниже:

..
conf.section(Some("Server")).unwrap().clone()
..
conf.section(Some("Database")).unwrap().clone()
..

, а затем I cargo run Это. и сервер работает нормально! см. Скриншот здесь .

...