GraphQL在Node.js中分离服务器错误和客户端错误的实现,通常涉及到对错误类型的判断和处理。GraphQL的错误可以分为两大类:服务器错误(如数据库连接失败、内部逻辑错误等)和客户端错误(如输入验证失败、类型错误等)。这两类错误在GraphQL中都被视为GraphQLError
的实例,但可以通过特定的属性来区分它们。
以下是一个使用try-catch
块来分离服务器错误和客户端错误的示例:
const { ApolloServer, gql } = require('apollo-server');
// 定义GraphQL Schema
const typeDefs = gql`
type Query {
hello: String
divide(a: Int, b: Int): Float
}
`;
// 定义Resolver
const resolvers = {
Query: {
hello: () => 'Hello world!',
divide: (_, { a, b }) => {
if (b === 0) {
throw new Error('Division by zero is not allowed');
}
return a / b;
},
},
};
// 创建Apollo Server实例
const server = new ApolloServer({
typeDefs,
resolvers,
formatError: (error) => {
// 这里可以根据error的类型来判断是服务器错误还是客户端错误
if (error.originalError) {
// 原始错误通常是服务器错误
console.error('Server error:', error.originalError);
return {
...error,
message: 'Internal server error',
extensions: {
code: 'INTERNAL_SERVER_ERROR',
},
};
} else {
// GraphQL错误通常是客户端错误
console.error('Client error:', error.message);
return error;
}
},
});
// 启动服务器
server.listen().then(({ url }) => {
console.log(`🚀 Server ready at ${url}`);
});
在上面的代码中,我们定义了一个简单的GraphQL Schema和Resolver。在divide
函数中,我们故意抛出一个错误来模拟客户端错误(除数为零)。在Apollo Server的formatError
函数中,我们检查错误是否有originalError
属性。如果有,这通常意味着有一个服务器端的原始错误(例如,从数据库操作中抛出的错误)。如果没有,这通常是一个GraphQL解析器中抛出的客户端错误。
请注意,这个示例使用了Apollo Server,它是构建GraphQL服务器的流行框架。在实际应用中,你可能需要根据你的项目需求和所使用的GraphQL库来调整错误处理的逻辑。
参考链接:
通过这种方式,你可以有效地在Node.js中分离和处理GraphQL的服务器错误和客户端错误。
领取专属 10元无门槛券
手把手带您无忧上云