微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Graphql Mutation 出现内部服务器错误 500

如何解决Graphql Mutation 出现内部服务器错误 500

As you can see that this query is showing the correct error message

viewmodelScope.launch {
            val req = RequestCodeMutation(phoneNumber)
            val response = try {
                ApolloClientManager
                    .apolloClient
                    .suspendMutate(req)
            }
            catch (e: ApolloException) {
                println(e.message)
                isError.value = true
                null
            }
            finally {
                loading.value = false
            }
            val requestCode = response?.data?.requestCode
            println(response?.errors)
}
suspend fun <D : Operation.Data,T,V : Operation.Variables> ApolloClient.suspendMutate(mutation: Mutation<D,V>): Response<T> =
    mutate(mutation).toDeferred().await()

这是我在服务器端的验证器。它在 Graphiql 上显示正确,但是,我无法在客户端收到此消息。

requestCode = async (resolve,source,args,context,info) => {
        let { phoneNumber } = args;

        phoneNumber = validator.trim(phoneNumber);
        Object.assign(args,{ phoneNumber });

        if (!validator.isMobilePhone(phoneNumber)) {
            throw new UserInputError('Invalid phone number provided!');
        }

        return resolve(source,info);
    }

ApolloException.message 显示内部服务器错误response?.errors 显示 nullresponse?.errors 不应该是 null显示在 GraphiQL 上显示的正确错误消息。

解决方法

在您的 catch 块中,您可以基于 ApolloCall 构建一个新的 Response

请考虑以下事项:

import com.apollographql.apollo.api.Response
import com.apollographql.apollo.api.Error

fun <T> executeCall(call: ApolloCall<T>): Response<T> = try {
  apolloCall.toDeferred().await()
} catch (apolloException: ApolloException) {
  val error = Error(apolloException.message ?: "Unknown Error")
  Response.builder(apolloCall.operation()).errors(listOf(error)).build()
}

注意:我假设 ApolloClientManager.apolloClient.suspendMutate(req) 返回一个 ApolloCall<T> 实例。

然后你可以像这样使用这个函数:

val call =  ApolloClientManager.apolloClient.suspendMutate(RequestCodeMutation(phoneNumber))
val response = executeCall(call)

// check the response status code

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。