gpt4 book ai didi

rust - actix_web 中间件 ErrorHandlers 在 ServiceResponse 中返回错误消息

转载 作者:行者123 更新时间:2023-12-03 11:25:06 27 4
gpt4 key购买 nike

我正在 try catch 对我的服务器发出的请求可能发生的错误。

当我在我的一个 POST 请求(甚至在到达我的请求处理程序方法之前抛出)收到 400 时出现了这个问题,并且在启用调试日志后我没有收到关于问题是什么的反馈我看到了问题

[actix_web::types::json] Failed to deserialize Json from payload. Request path: /new_endpoint
Json deserialize error: invalid length: expected one of [36, 32], found 10 at line 2 column 20
[DEBUG actix_web::middleware::logger] Error in response: Deserialize(Error("invalid length: expected one of [36, 32], found 10", line: 2, column: 20))

现在,我希望能够捕获该错误,以便它可以在 400 响应的正文中发回。

我已经开始了
App::new()
.wrap(ErrorHandlers::new().handler(http::StatusCode::BAD_REQUEST, handle_bad_request))

并在 handle_bad_request我能够修改响应正文以包含新信息
fn handle_bad_request<B>(mut res: dev::ServiceResponse<B>) -> Result<ErrorHandlerResponse<Body>> {
res.response_mut().headers_mut().insert(
http::header::CONTENT_TYPE,
http::HeaderValue::from_static("application/json"),
);
let new_res: ServiceResponse<Body> = res.map_body(|_head, _body| {
ResponseBody::Other(Body::Message(Box::new("New Response Body")))
});
Ok(ErrorHandlerResponse::Response(new_res))
}

理想情况下,我想做的是在 ServiceResponse 中处理错误并将其发送回响应中。我可以通过执行读取错误
match res.response().error() {
Some(e) => println!("{0}", e),
None => println!("Error None")
};

但至于实际采取该错误并将其发送回响应中,我无法弄清楚。

最佳答案

解决这个问题 format!("{:?}", res.reponse().error())需要。那确实返回 Some(error message)所以只是为了说明以下工作。

let errorMsg: String = match res.response().error() {
Some(e) => format!("{:?}", e),
None => String::from("Unknown Error")
};
let new_res: ServiceResponse<Body> = res.map_body(|_head, _body| {
ResponseBody::Other(Body::Message(Box::new(errorMsg)))
});
Ok(ErrorHandlerResponse::Response(new_res))

关于rust - actix_web 中间件 ErrorHandlers 在 ServiceResponse 中返回错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60405947/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com