【问题标题】:Handling errors in mutations处理突变中的错误
【发布时间】:2016-06-13 08:07:22
【问题描述】:

假设我正在尝试创建一辆自行车作为突变

var createBike = (wheelSize) => {
  if (!factoryHasEnoughMetal(wheelSize)) {
    return supplierError('Not enough metal');
  }
  return factoryBuild(wheelSize);
}

如果没有足够的钢材来制造闪亮的轮子,会发生什么?我们可能需要客户端出错。我如何通过以下突变从我的 graphQL 服务器中获取它们:

// Mutations
mutation: new graphql.GraphQLObjectType({
  name: 'BikeMutation',
  fields: () => ({
    createBike: {
      type: bikeType,
      args: {
        wheelSize: {
          description: 'Wheel size',
          type: new graphql.GraphQLNonNull(graphql.Int)
        },
      },
      resolve: (_, args) => createBike(args.wheelSize)
    }
  })
})

是否像返回服务器/我定义的错误类型一样简单?

【问题讨论】:

    标签: graphql graphql-js


    【解决方案1】:

    不确定这是否是你所追求的......

    只要抛出一个新错误,它应该返回类似

    {
      "data": {
        "createBike": null
      },
      "errors": [
        {
          "message": "Not enough metal",
          "originalError": {}
        }
      ]
    }
    

    您的客户端应该只处理响应

    if (res.errors) {res.errors[0].message}
    

    我所做的是传递一个带有 errorCode 和消息的对象,在这个阶段,最好的方法是对其进行字符串化。

    throw new Errors(JSON.stringify({
          code:409, 
          message:"Duplicate request......"
    }))
    

    注意:你也可能对这个库感兴趣https://github.com/kadirahq/graphql-errors

    您可以屏蔽所有错误(将消息转为“内部错误”),或定义 userError('message to the client'),这些不会被替换。

    【讨论】:

    • 哈哈,就是这么简单!感谢您的明确回复和graphql-errors
    • 规范是否总是直接从 API 返回本地化消息,而不是让客户端随意处理翻译的错误键?
    猜你喜欢
    • 2018-09-02
    • 2017-09-14
    • 2020-02-16
    • 2018-04-08
    • 2016-05-30
    • 2019-10-25
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    相关资源
    最近更新 更多