使用actix-web 2.0提供静态文件

问题描述

我正在努力使用锈迹的actix-web 2.0框架。我希望我的rust服务器提供我的index.html文件,但是可用的大多数帮助都是旧版本,因此新版本中发生了很多变化。我尝试了以下代码,但不适用于actix-web 2.0。请在actix-web 2.0中提出一些可行的解决方案。对不起,因为我刚接触生锈,所以犯了错误。

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

Edit1:我遇到类型不匹配错误,但是使用pathBuf作为注释中的答案救了我。

Edit2:通过尝试回答中给出的代码,我可以提供单个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命令检查它可以正常工作,现在我正在尝试构建前端以及尝试提供静态文件的第一步。

Edit3:https://github.com/actix/examples/tree/master/static_index

也是帮助我解决此处问题的答案的示例

解决方法

由于描述不详细,所以我不确定您要面对什么问题,但是,我运行的是默认示例,并且可以正常工作。

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"

希望这对您有用

,

如果您想将资源真正嵌入可执行文件中,可以使用https://crates.io/crates/actix-web-static-files

它使用build.rs来准备资源,以后您就可以拥有一个没有依赖性的可执行文件。

另外,它还支持基于npm的构建。

基本上,我是该板条箱的作者。 actix-web的2.x和3.x版本都有版本。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...