rust 用actix-web2. 0提供静态文件

edqdpe6u  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(174)

我正在与actix-web 2.0框架的rust作斗争。我希望我的rust服务器为我的index.html文件提供服务,但大多数可用的帮助都是旧版本的,因此在新版本中有很多变化。我试着按照下面的代码,但它不适用于actix-web2. 0。请提出一些在actix-web2. 0中的工作解决方案。

use actix_files::NamedFile;
use actix_web::{HttpRequest, Result};
async fn index(req: HttpRequest) -> Result<NamedFile> {
    Ok(NamedFile::open(path_to_file)?)
}

通过尝试答案中给出的代码,我可以提供一个单一的html文件,但它无法加载链接的JavaScript文件。我尝试了https://actix.rs/docs/static-files/中建议的以下方法来服务目录。

#[actix_rt::main]
async fn main() -> std::io::Result<()> {
    dotenv::dotenv().ok();
    std::env::set_var("RUST_LOG", "actix_web=debug");
    let database_url = std::env::var("DATABASE_URL").expect("set DATABASE_URL");

    // create db connection pool
    let manager = ConnectionManager::<PgConnection>::new(database_url);
    let pool: Pool = r2d2::Pool::builder()
        .build(manager)
        .expect("Failed to create pool.");
    
    //Serving the Registration and sign-in page
    async fn index(_req: HttpRequest) -> Result<NamedFile> {
        let path: PathBuf = "./static/index.html".parse().unwrap();
        Ok(NamedFile::open(path)?)
    }

    // Start http server
    HttpServer::new(move || {
        App::new()
            .data(pool.clone())
            .service(fs::Files::new("/static", ".").show_files_listing())
            .route("/", web::get().to(index))
            .route("/users", web::get().to(handler::get_users))
            .route("/users/{id}", web::get().to(handler::get_user_by_id))
            .route("/users", web::post().to(handler::add_user))
            .route("/users/{id}", web::delete().to(handler::delete_user))
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

以上是我的主要方法。在浏览器控制台中,我仍然得到无法加载Registration.js资源的错误。以下是我的文件夹结构:

-migrations
-src
  -main.rs
  -handler.rs
  -errors.rs
  -models.rs
  -schema.rs
-static
 -index.html
 -Registration.js
-target
Cargo.toml
.env
Cargo.lock
diesel.toml

我已经建立了与数据库集成的后端,它工作正常,通过curl命令检查,现在我正试图建立前端,并作为第一步尝试提供静态文件。

x9ybnkn6

x9ybnkn61#

我不知道你面临什么问题,因为描述不详细,但是,我运行了默认的例子,它是工作。

use actix_files::NamedFile;
use actix_web::{HttpRequest, Result};
use std::path::PathBuf;

/// https://actix.rs/docs/static-files/
async fn index(_req: HttpRequest) -> Result<NamedFile> {
    let path: PathBuf = "./files/index.html".parse().unwrap();
    Ok(NamedFile::open(path)?)
}

#[actix_rt::main]
async fn main() -> std::io::Result<()> {
    use actix_web::{web, App, HttpServer};

    HttpServer::new(|| App::new().route("/", web::get().to(index)))
        .bind("127.0.0.1:8088")?
        .run()
        .await
}

项目结构

- files/index.html
- src/index.rs
- cargo.toml

依赖关系

[dependencies]
actix-web = "2.0.0"
actix-files = "0.2.2"
actix-rt = "1.1.1"
wfveoks0

wfveoks02#

如果你真的想把资源嵌入到可执行文件中,你可以使用https://crates.io/crates/actix-web-static-files
它使用build.rs来准备资源,之后你可以只拥有一个没有依赖关系的可执行文件。
另外,它还支持基于npm的开箱即用的构建。
基本上,我是这个箱子的作者。actix-web的2.x和3.x版本都有。

rjee0c15

rjee0c153#

请参阅下面的代码,它适用于整个子目录:
main.rs

use actix_files as fs;
use actix_web::{App, HttpServer};

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new().service(
            fs::Files::new("/", "./public")
                .show_files_listing()
                .index_file("index.html")
                .use_last_modified(true),
        )
    })
    .bind("0.0.0.0:8000")?
    .run()
    .await
}

Cargo.toml

[package]
name = "actixminimal"
version = "0.1.0"
edition = "2021"

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

[dependencies]
actix-web = "4"
actix-files = "0.6.2"

它执行文件服务非常快,我曾经尝试过。
在这种情况下,您可以创建一个“公共”文件夹,或者使用自己的“静态”文件夹(然后更改与文件夹名称相关的代码),或者从Web框架导出静态文件。我使用GatsbyJS和我使用部署参数到“公共”文件夹。我在GitHub上分享了它。https://github.com/openmymai/actixminimal.git

相关问题