域名 AXUM.RS 将于2025年10月到期。我们无意再对其进行续费,我们希望你能够接续这个域名,让更多 AXUM 开发者继续受益。现在,我们已启用新域名 AXUM.EU.ORG
  • 方案AXUM.RS 域名 = 3000
如果你有意接续这份 AXUM 情怀,请与我们取得联系。
说明:
  1. 如果有人购买 AXUM.RS 域名,或者该域名到期,本站将使用免费域名 AXUM.EU.ORG 继续提供服务。

配置文件

本章我们将实现配置文件的加载。我们将对 axum 的监听地址和 PostgreSQL 相关的信息进行配置,并保存到.env文件中。

本章代码在01/配置文件分支。

本章代码在01/配置文件分支。

.env

WEB.ADDR=0.0.0.0:9527
PG.USER=axum_rs
PG.PASSWORD=axum.rs
PG.DBNAME=axum_rs
PG.PORT=5432
PG.HOST=pg.axum.rs
PG.POOL.MAX_SIZE=30

首先,我们要在 src/main.rs 声明一个 config 模块:

mod config;

然后,创建一个 src/config.rs 文件,并定义相关结构体:

/// Web 配置
#[derive(Deserialize)]
pub struct WebConfig {
    pub addr: String,
}

/// 应用配置
#[derive(Deserialize)]
pub struct Config {
    pub web: WebConfig,
}
impl Config {
    /// 从环境变量中初始化配置
    pub fn from_env() -> Result<Self, config::ConfigError> {
        let mut cfg = config::Config::new();
        cfg.merge(config::Environment::new())?;
        cfg.try_into()
    }
}

为了演示,我们创建 src/handler.rs 文件,并定义一个 handler:

pub async fn usage() -> &'static str {
    r#"
        ### USAGE ###
        - GET /todo -- get all todo list
        - POST /todo -- create a todo list
        - GET /todo/:list_id -- get detail for a todo list
        - DELETE /todo/:list_id -- delete a todo list, include it's items
        - PUT /todo/:list_id -- edit a todo list
        - GET /todo/:list_id/items -- get items from todo list
        - GET /todo/:list_id/items/:item_id -- get detail for a todo item
        - PUT /todo/:list_id/items/:item_id -- edit a todo item(set the item to checked)
        - DELETE /todo/:list_id/items/:item_id -- delete a todo item
    "#
}
mod handler;

解析.env并初始化配置

现在可以在main函数中解析.env并初始化配置了:

// 解析 .env 文件
dotenv().ok();
// 初始化配置
let cfg = config::Config::from_env().expect("初始化配置失败");

创建 axum 服务

接下来,我们可以创建 axum 服务了

// 路由
let app = Router::new().route("/", get(handler::usage));
// 绑定到配置文件设置的地址
axum::Server::bind(&cfg.web.addr.parse().unwrap())
    .serve(app.into_make_service())
    .await
    .unwrap();

下一章,我们将进行错误处理。

要查看完整内容,请先登录