【发布时间】:2019-09-09 14:09:00
【问题描述】:
这是我第一次尝试使用 actix-web 编写一个带有 rust 的小型 web 服务。
下面的代码是一个请求处理程序,它打算做三件事,在数据库中插入一个条目,如果该 db 调用成功则发送电子邮件,然后返回一个 json 有效负载作为响应。
data.dal(数据库调用)和data.email_service是对Actor的引用。
问题:我无法捕获data.dal 返回的错误。任何重新配置以下代码的尝试似乎都会给我一个错误,指出编译器无法找到从 Actix Mailbox 到 [Type] 的转换。
是否有替代/更好的方法来重写它?基本上,当发出请求时,我希望能够调用 Actor A。如果 A 的结果正常,则调用 Actor B。如果两者的结果都正常,则返回 JSON 有效负载。如果 A 或 B 返回错误(可以有不同的错误类型),则返回自定义错误消息。
pub fn register_email(
invitation: Json<EmailInvitationInput>,
data: web::Data<AppState>,
) -> impl Future<Item=HttpResponse, Error=Error> {
let m = dal::queries::CreateEmailInvitation { email: invitation.email.clone() };
data.dal.send(m)
.from_err()
.and_then(move |res| {
let invite = res.unwrap();
let email_input = email::SendLoginLink {
from: "from_email".to_string(),
to: "to_email".to_string(),
};
data.email_service.send(email_input)
.from_err()
.and_then(move |res| match res {
Ok(_) => {
Ok(HttpResponse::Ok().json(EmailInvitationOutput { expires_at: invite.expires_at }))
}
Err(err) => {
debug!("{:#?}", err);
Ok(ServiceError::InternalServerError.error_response())
}
})
})
}
【问题讨论】:
标签: rust rust-actix actix-web