cool_core/middleware/
exception.rs1use crate::constant::ResCode;
8use crate::error::CoolError;
9use salvo::prelude::*;
10use serde::Serialize;
11use tracing::error;
12
13#[derive(Debug, Serialize)]
15pub struct ErrorResponse {
16 pub code: i32,
18 pub message: String,
20}
21
22pub struct ExceptionFilter;
31
32#[async_trait::async_trait]
33impl Handler for ExceptionFilter {
34 async fn handle(
35 &self,
36 req: &mut Request,
37 depot: &mut Depot,
38 res: &mut Response,
39 ctrl: &mut FlowCtrl,
40 ) {
41 ctrl.call_next(req, depot, res).await;
43
44 let status = res.status_code.unwrap_or(StatusCode::OK);
46
47 if status.is_client_error() || status.is_server_error() {
49 if res.body.is_none() {
51 if let Ok(err_msg) = depot.get::<String>("error") {
53 error!("Request error: {}", err_msg);
54 let error_response = ErrorResponse {
55 code: status.as_u16() as i32,
56 message: err_msg.clone(),
57 };
58 res.render(Json(error_response));
59 } else {
60 let error_response = ErrorResponse {
62 code: ResCode::CommError.code(),
63 message: "请求处理失败".to_string(),
64 };
65 res.render(Json(error_response));
66 }
67 }
68 }
69 }
70}
71
72pub fn exception_filter() -> ExceptionFilter {
74 ExceptionFilter
75}
76
77pub fn handle_error(err: &CoolError) -> ErrorResponse {
81 error!("CoolError: {:?}", err);
82 ErrorResponse {
83 code: err.code().code(),
84 message: err.to_string(),
85 }
86}