如何在 GraphQL 中处理错误和发送响应

新手上路,请多包涵

我从 GraphQL 开始,我无法理解我们如何在 GraphQL 中抛出错误

我在网上浏览了几篇文章,但几乎所有文章都使用 Apollo,而且代码结构看起来与我的工作方式大不相同。

考虑这段代码,我在这里进行了修改,现在如何发送带有错误的响应消息并在发生错误时更改标头状态消息?

   AddNewPersonalInfo: {
  type: userDashboardType,
  args: {
    parameter: {
      type: userCreationlInputType
    }
  },
  resolve: async (parent, args, context) => {
    args.parameter.userId = context.req.headers.userId
    //Check if user info already exsist
    const checkIfUserInformationExsist = await getSelectedThingFromTable('CatsWork_personal', 'userId', `${userId}`)
    if (checkIfUserInformationExsist[0]) {
      const error = {
        code: 403,
        message: 'User info Already exsist'
      }
      throw new Error(error)
    } else {
      try {
      const addLinkedinUser = await insertIntheTable('personal', payload)
      return true
      } catch (err) {
        console.error(err)
        throw new Error(err)
      }
    }
  }
}

原文由 anny123 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 647
1 个回答

我在我的一个项目中遇到过,很难设置响应的状态代码。所以,我做了一些自定义错误响应来使用 express-graphql 识别正确的 statusCode

下面是示例( _我在我的一个项目中使用过的_):

---—– app.js file ——–

 const graphqlHTTP = require('express-graphql')

app.use('/graphql', (req, res) => {
  graphqlHTTP({
    schema: GraphQLSchema, //A GraphQLSchema instance from GraphQL.js. A schema must be provided.
    graphiql: true,
    context: { req },
    formatError: (err) => {
      const error = getErrorCode(err.message)
      return ({ message: error.message, statusCode: error.statusCode })
    }
  })(req, res)
})

---—– getErrorCode 功能实现——–

 const { errorType } = require('../constants')

const getErrorCode = errorName => {
  return errorType[errorName]
}

module.exports = getErrorCode

---—– Constant.js 文件——–

 exports.errorName = {
  USER_ALREADY_EXISTS: 'USER_ALREADY_EXISTS',
  SERVER_ERROR: 'SERVER_ERROR'
}

exports.errorType = {
  USER_ALREADY_EXISTS: {
    message: 'User is already exists.',
    statusCode: 403
  },
  SERVER_ERROR: {
    message: 'Server error.',
    statusCode: 500
  }
}


现在,我们准备好使用我们的设置了。

从您的查询或突变中,您需要需要常量文件并返回自定义错误:

 const { errorName } = require('../constant')

AddNewPersonalInfo: {
  type: userDashboardType,
  args: {
    parameter: {
      type: userCreationlInputType
    }
  },
  resolve: async (parent, args, context) => {
    args.parameter.userId = context.req.headers.userId
    //Check if user info already exsist
    const checkIfUserInformationExsist = await getSelectedThingFromTable('CatsWork_personal', 'userId', `${userId}`)
    if (checkIfUserInformationExsist[0]) {
      const error = {
        code: 403,
        message: 'User info Already exsist'
      }
      throw new Error(errorName.USER_ALREADY_EXISTS) // Here you can use error from constatnt file
    } else {
      try {
      const addLinkedinUser = await insertIntheTable('personal', payload)
      return true
      } catch (err) {
        console.error(err)
        throw new Error(errorName.SERVER_ERROR) // Here you can use error from constatnt file
      }
    }
  }
}

——–错误响应——–

 {
  error: [{
    "statusCode": 403,
    "message": "User is already exists."
  }],
  data: null
}

我们只需要从 FS 端编写自定义错误处理。

注意:- formatError: 已弃用并替换为 customFormatErrorFn 。它将在 1.0.0 版本中被删除。您可以参考 customFormatErrorFn

原文由 Hardik Shah 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题