我对 Rust 非常非常陌生。我正在尝试让这个 /send_email 端点正常工作。如果有人能指出我的错误方向,我将非常感激。
我在 send_email 处理程序中的发送电子邮件路由:
pub fn router(client: Arc<Client>) -> Router {
Router::new()
.route("/send-email", post(send_email_request))
}
错误:
the trait bound `fn(axum::Json<EmailRequest>, Extension<Arc<aws_sdk_sesv2::Client>>) -> impl std::future::Future<Output = impl IntoResponse> {send_email_request}: Handler<_, _, _>` is not satisfied
完整文档:
use axum::{
extract::{Extension, Json},
response::{IntoResponse, Response},
http::StatusCode,
routing::post,
Router,
Json as AxumJson,
};
use aws_sdk_sesv2::Client;
use std::sync::Arc;
use serde_json::json;
use crate::signage::email_service::{send_email, EmailRequest};
use crate::util::check_payload; // Assuming this function is correctly implemented
use tracing::instrument;
pub fn router(client: Arc<Client>) -> Router {
Router::new()
.route("/send-email", post(send_email_request))
}
#[instrument]
#[utoipa::path(
post,
path = "/api/v1/send_email",
responses(
(status = 200, description = "Email sent successfully", body = String),
(status = 500, description = "Failed to send email")
)
)]
pub async fn send_email_request(
Json(payload): Json<EmailRequest>,
Extension(client): Extension<Arc<Client>>
) -> impl IntoResponse {
let payload = match check_payload(&payload) {
Ok(valid_payload) => valid_payload,
Err(error) => return (StatusCode::BAD_REQUEST, AxumJson(json!({"error": error.to_string()}))).into_response(),
};
match send_email(&client).await {
Ok(_) => {
(StatusCode::OK, AxumJson(json!({"message": "Email sent successfully."}))).into_response()
},
Err(e) => {
(StatusCode::INTERNAL_SERVER_ERROR, AxumJson(json!({"error": format!("Failed to send email: {}", e)}))).into_response()
}
}
}
还有一些其他问题。主要的事情最终变得很简单。这是 send_email_request 中的顺序问题。扩展需要位于有效负载之前。所以现在,它
Extension(client): Extension<Arc<Client>>,
payload: Option<Json<EmailRequest>>