fix(api): 优化 /health 端点错误提示
This commit is contained in:
@@ -1,21 +1,62 @@
|
|||||||
use actix_web::{web, get, HttpResponse, Responder};
|
use actix_web::{web, get, HttpResponse, Responder};
|
||||||
use sqlx::postgres::PgPool;
|
use sqlx::postgres::PgPool;
|
||||||
|
use serde::Serialize;
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
pub struct HealthResponse {
|
||||||
|
pub status: String,
|
||||||
|
pub database: String,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub error: Option<String>,
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub hint: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
#[get("/health")]
|
#[get("/health")]
|
||||||
pub async fn health_check(pool: web::Data<PgPool>) -> impl Responder {
|
pub async fn health_check(pool: web::Data<PgPool>) -> impl Responder {
|
||||||
// 检查数据库连接
|
|
||||||
match sqlx::query("SELECT 1").fetch_one(pool.get_ref()).await {
|
match sqlx::query("SELECT 1").fetch_one(pool.get_ref()).await {
|
||||||
Ok(_) => HttpResponse::Ok().json(serde_json::json!({
|
Ok(_) => {
|
||||||
"status": "healthy",
|
HttpResponse::Ok().json(HealthResponse {
|
||||||
"database": "connected"
|
status: "ok".to_string(),
|
||||||
})),
|
database: "connected".to_string(),
|
||||||
|
error: None,
|
||||||
|
hint: None,
|
||||||
|
})
|
||||||
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
tracing::error!("健康检查失败: {}", e);
|
let err_str = e.to_string();
|
||||||
HttpResponse::ServiceUnavailable().json(serde_json::json!({
|
let (error_msg, hint_msg) = if err_str.contains("connection refused") {
|
||||||
"status": "unhealthy",
|
(
|
||||||
"database": "disconnected",
|
"无法连接到数据库".to_string(),
|
||||||
"error": "数据库连接失败"
|
"请检查数据库服务是否运行".to_string(),
|
||||||
}))
|
)
|
||||||
|
} else if err_str.contains("Connection timed out") {
|
||||||
|
(
|
||||||
|
"数据库连接超时".to_string(),
|
||||||
|
"请检查网络连接".to_string(),
|
||||||
|
)
|
||||||
|
} else if err_str.contains("does not exist") {
|
||||||
|
("数据库不存在".to_string(), "请检查数据库配置".to_string())
|
||||||
|
} else if err_str.contains("28P01") {
|
||||||
|
(
|
||||||
|
"数据库认证失败".to_string(),
|
||||||
|
"用户名或密码错误".to_string(),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
(
|
||||||
|
"数据库连接失败".to_string(),
|
||||||
|
"请查看服务器日志获取详细信息".to_string(),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
tracing::error!("健康检查失败: {:?}", e);
|
||||||
|
|
||||||
|
HttpResponse::ServiceUnavailable().json(HealthResponse {
|
||||||
|
status: "error".to_string(),
|
||||||
|
database: "disconnected".to_string(),
|
||||||
|
error: Some(error_msg),
|
||||||
|
hint: Some(hint_msg),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user