You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何简化嵌套ok_or()调用?无需改返回类型或辅助函数

解决方案

可以通过两种方式减少重复的.ok_or()调用,且不需要修改返回类型或现有辅助函数:

1. 预定义错误实例并复用

既然所有错误场景返回的都是同一个AppError实例,先提前创建好这个错误,后续重复引用即可:

pub async fn refresh_uses_session(
    State(app_state): State<AppState>,
    cookie_jar: CookieJar,
) -> Result<Response, AppError> {
    // 提前创建错误实例,后续复用
    let auth_error = (StatusCode::UNAUTHORIZED, "Invalid Credentials").into_app_error();

    let refresh_token_cookie = cookie_jar
        .get("refresh_token")
        .ok_or(auth_error.clone())?;

    let cookie_expiration_time = refresh_token_cookie
        .expires()
        .ok_or(auth_error.clone())?
        .datetime()
        .ok_or(auth_error)?;

    if cookie_expiration_time <= OffsetDateTime::now_utc() {
        return Err(auth_error);
    }

    //…
}

注:如果AppError未实现Clone,可以改为每次通过闭包生成错误(比如|| (StatusCode::UNAUTHORIZED, "Invalid Credentials").into_app_error()),但预定义实例+克隆的方式代码更简洁,通常自定义错误实现Clone成本很低。

2. 使用局部宏封装逻辑

定义一个局部宏,把重复的.ok_or(...)逻辑封装进去,调用时只需传入要处理的表达式:

pub async fn refresh_uses_session(
    State(app_state): State<AppState>,
    cookie_jar: CookieJar,
) -> Result<Response, AppError> {
    // 局部宏,封装授权错误的ok_or逻辑
    macro_rules! auth_ok_or {
        ($expr:expr) => {
            $expr.ok_or((StatusCode::UNAUTHORIZED, "Invalid Credentials").into_app_error())?
        };
    }

    let refresh_token_cookie = auth_ok_or!(cookie_jar.get("refresh_token"));

    let cookie_expiration_time = auth_ok_or!(auth_ok_or!(refresh_token_cookie.expires()).datetime());

    if cookie_expiration_time <= OffsetDateTime::now_utc() {
        return Err((StatusCode::UNAUTHORIZED, "Invalid Credentials").into_app_error());
    }

    //…
}

这种方式完全避免了重复书写错误构造代码,代码可读性也更强。

内容的提问来源于stack exchange,提问作者Mohit Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:52:43