Node.js GraphQL自定义错误格式化求助(不使用express-graphql)
解决GraphQL自定义错误格式化(不使用express-graphql)的问题
我懂你现在的处境——直接修改graphql.formatError没生效确实让人头疼,这是因为在较新的GraphQL版本里,这个全局修改的方式已经被废弃,而且就算在旧版本中,手动调用graphql执行查询时,这个全局设置也不会自动生效。下面给你两个实用的解决思路:
1. 手动处理查询结果中的错误
当你直接调用graphql()函数执行查询后,会得到包含errors字段的结果,你需要显式遍历这些错误,用自定义的格式化函数处理它们。示例代码如下:
import { graphql, GraphQLSchema, GraphQLObjectType, GraphQLString } from 'graphql'; // 先定义你的GraphQL Schema const testSchema = new GraphQLSchema({ query: new GraphQLObjectType({ name: 'TestQuery', fields: { greet: { type: GraphQLString, resolve: () => { // 抛出一个带自定义扩展信息的错误 const error = new Error('数据库连接失败'); error.extensions = { code: 'DB_CONN_ERROR', status: 500 }; throw error; }, }, }, }), }); // 自定义错误格式化函数 const formatGraphQLError = (err) => { return { message: err.message, errorCode: err.extensions?.code || 'UNKNOWN_ERROR', status: err.extensions?.status || 400, // 可以根据需求添加更多字段,比如堆栈信息(生产环境建议关闭) // stack: process.env.NODE_ENV === 'development' ? err.stack : undefined }; }; // 执行查询并处理错误 const runQuery = async () => { const queryResult = await graphql({ schema: testSchema, source: '{ greet }', }); // 检查并格式化错误 if (queryResult.errors) { queryResult.errors = queryResult.errors.map(formatGraphQLError); } return queryResult; };
这种方式的好处是完全可控,你可以根据环境(开发/生产)返回不同的错误信息,避免泄露敏感的堆栈信息。
2. 了解全局graphql.formatError失效的原因
从GraphQL v16开始,graphql.formatError已经被标记为废弃,官方不再推荐使用全局设置的方式处理错误,而是鼓励开发者显式处理查询结果中的错误,这样代码的可读性和维护性更高。就算在v16之前的版本,这个全局函数也只会在某些特定的场景(比如express-graphql内部调用)生效,手动调用graphql()时并不会自动触发它。
如果你的项目里有用到其他GraphQL服务框架(比如Apollo Server),也可以通过框架自带的错误格式化配置来处理,但既然你明确说不用express-graphql,上面的手动处理方式应该是最适合你的。
内容的提问来源于stack exchange,提问作者bthe0
相关产品推荐
相关产品推荐

