【问题标题】:Actix/Diesel API not responding to requests from PostmanActix/Diesel API 未响应 Postman 的请求
【发布时间】:2023-02-10 15:20:19
【问题描述】:

我的代码似乎没关系,因为它可以正确编译并且非常简单。但是当我使用cargo run 运行我的应用程序时,即使程序正确执行并输出一些调试 printlns,它也不会响应任何请求。

这是我的 main.rs:

use actix_web::{web, App, HttpServer};
use diesel::r2d2::{ConnectionManager, Pool};
use diesel::sqlite::SqliteConnection;
use dotenvy::dotenv;

#[path = "api/books/books_handlers.rs"]
mod books_handlers;
#[path = "api/books_relationships/books_relationships_handlers.rs"]
mod books_relationships_handlers;
mod models;
mod routes;
mod schema;
mod logger;

#[actix_rt::main]
async fn main() -> std::io::Result<()> {

    // Load .env file and set initialization variables
    dotenv().ok();
    std::env::set_var("RUST_LOG", "actix_web=debug");
    let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set");


    // Create db connection pool with SQLite
    let manager = ConnectionManager::<SqliteConnection>::new(database_url);
    let pool: Pool<ConnectionManager<SqliteConnection>> = r2d2::Pool::builder()
        .build(manager)
        .expect("Failed to create pool.");

    // Start HTTP server and register routes
    println!("Starting server at http://localhost:8080");
    HttpServer::new(move || {
        App::new()
            .app_data(pool.clone())
            // Book class
            .route("/create_book", web::post().to(books_handlers::create_book_handler))
            .route("/list_books", web::get().to(books_handlers::list_books_handler))
            .route("/get_book/{id}", web::post().to(books_handlers::read_book_by_id_handler))
            .route("/update_book/{id}", web::put().to(books_handlers::update_book_handler))
            .route("/delete_book/{id}", web::delete().to(books_handlers::delete_book_handler))
            // BookRelationships class
            .route("/create_book_relationship", web::post().to(books_relationships_handlers::create_book_relationship_handler))
            .route("/list_book_relationships", web::get().to(books_relationships_handlers::list_books_handler))
            .route("/get_book_relationship/{id}", web::post().to(books_relationships_handlers::read_book_by_id_handler))
            .route("/update_book_relationship/{id}", web::put().to(books_relationships_handlers::update_book_handler))
            .route("/delete_book_relationship/{id}", web::delete().to(books_relationships_handlers::delete_book_handler))

        })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

这是第一个处理程序,我正在尝试使用 Postman:

pub async fn create_book_handler(book_data: web::Json<Book>, pool: web::Data<DbPool>) -> HttpResponse {
    println!("create_book_handler: {:#?}", book_data);  // <-- this never gets executed
    let result = books_dao::create_book(book_data, pool).await;
    match result {
        Ok(book) => {
            println!("create_book_handler, OK. Book: {:#?}", book);
            HttpResponse::Ok()
            .content_type(ContentType::json())
            .json(&book)
        },
        Err(err) => {
            println!("create_book_handler, ERROR: {:#?}", err);
            log(LogType::Error, err.to_string());
            HttpResponse::InternalServerError()
                .content_type(ContentType::json())
                .body("{err: 'Unable to insert book into database'")
        }
    }
}

然后代码执行此函数,调用 Diesel 并更改 DB:

pub async fn create_book(book: web::Json<Book>, pool: web::Data<DbPool>) -> Result<usize, Error> {
    let mut conn = pool
        .get()
        .expect("Failed to get database connection from pool");

    diesel::insert_into(books::table)
        .values(book.into_inner())
        .execute(&mut conn)
}

但问题似乎更早:甚至没有 println!在处理程序开始时执行。当我启动应用程序并向http://127.0.0.1:8080/create_book 发送 POST 请求时,我在 Postman 中收到以下错误:

Requested application data is not configured correctly. View/enable debug logs for more details.

我是否以错误的方式发送了请求,或者 API 是否出现故障?

【问题讨论】:

标签: rust actix-web


【解决方案1】:

DbPool 包装不正确。它应该看起来像

...
    App::new()
            .app_data(actix_web::web::Data::new(pool.clone()))
...

这正确地将 DB 池包装在智能指针中,路由处理程序随后可以在您的应用程序中使用该智能指针

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2020-09-01
    • 1970-01-01
    • 2020-01-23
    • 2022-07-04
    相关资源
    最近更新 更多