在 Graphql 突变上获取内部服务器错误 500

Posted

技术标签:

【中文标题】在 Graphql 突变上获取内部服务器错误 500【英文标题】:Getting Internal Server Error 500 on Graphql Mutation 【发布时间】:2021-04-10 02:50:45 【问题描述】:

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, T, 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, args, context, info);
    

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

【问题讨论】:

您在 catch 块中返回 null。所以响应为空,response?.errors @ChristianB 如果我返回任何其他内容,它不允许我访问响应的数据属性。该块应该返回什么? 【参考方案1】:

在您的 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&lt;T&gt; 的实例。

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

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

// check the response status code

【讨论】:

我稍微更新了我的答案。希望对您有所帮助。 apolloException.message 仍然是内部服务器错误。我希望消息是“提供的电话号码无效 我不知道你的意思或你的确切问题是什么。正如我所展示的,如果您发现异常,您可以创建一个新的错误消息。您可以创建一个新错误:val error = Error("Invalid phone number provided")。希望对你有所帮助。 我已经编辑了我的问题,你现在可能能更好地理解它了 响应码是什么?是2xx还是一些错误?如果您收到ApolloException,其中包含什么消息?

以上是关于在 Graphql 突变上获取内部服务器错误 500的主要内容,如果未能解决你的问题,请参考以下文章

表达 http:graphql 突变上的 500 错误以在反应中从阿波罗客户端创建用户

Prisma graphql updateNode 突变

是否可以从 Relay 突变访问 GraphQL 验证错误?

在 Angular Apollo Graphql 中访问突变结果

Apollo GraphQL 突变(对象参数)

GraphQL 查询/突变的响应