背景:
sqlx我在与订阅集成时遇到问题juniper。
我收到了Pin<Box<dyn Stream<Item = Result<User, sqlx::Error>> + 'e + Send>>来自sqlx::query::QueryAs::fetch().
juniper需要将订阅返回为Pin<Box<dyn Stream<Item = Result<User, juniper::FieldError>> + Send>>.
Result<User, sqlx::Error>请注意从到 的更改Result<User, juniper::FieldError>。使用map_err()fromfutures::TryStreamExt,我创建了以下代码来执行查询并转换错误类型。
type UsersStream =
Pin<Box<dyn Stream<Item = Result<User, FieldError>> + Send>>;
#[juniper::graphql_subscription(Context = Context)]
impl SubscriptionRoot {
async fn users(context: &Context) -> UsersStream {
let sqlx::query_as!(User, "SELECT * FROM users")
.fetch(&context.pool)
.map_err(|e| {
FieldError::new(
"Database error",
graphql_value!(format!("{}", e)))
})
.boxed() …Run Code Online (Sandbox Code Playgroud)