GraphQL 如何在 node.js 中将服务器错误与客户端错误(最好使用 TryCatch 块)分开?
Posted
技术标签:
【中文标题】GraphQL 如何在 node.js 中将服务器错误与客户端错误(最好使用 TryCatch 块)分开?【英文标题】:GraphQL How to seperate Server errors from Client errors (ideally using TryCatch blocks) in node.js? 【发布时间】:2021-10-04 09:21:48 【问题描述】: try
const res = await UserModel.findOne(username: username)
if (res === null)
throw new Error("Your username or password was incorrect USERNAME")
const passwordValid = await bcrypt.compare(password, res.hash);
if (!passwordValid)
throw new Error("Your username or password was incorrect PASSWORD")
else
console.log("res is: ", res)
const convertBalanceToNum =
...res._doc,
balance: res.balance.toString()
console.log("converted balance is: ", convertBalanceToNum)
return convertBalanceToNum
catch (error)
console.error(error)
throw new Error("Unable to verify password due to server error")
我想将客户端错误(例如客户端提供错误的用户名或密码组合)与不涉及客户端提供错误信息的服务器错误区分开来。
理想情况下,Try
块内的 throw new Error
语句用于客户端错误,Catch
块内的语句用于服务器错误。
但是当错误的用户名或密码组合被触发时,catch 块而不是 try 块中的错误语句触发
这是有道理的,但现在我对如何在 GraphQL 中实现特定于服务器的错误感到困惑,有什么帮助吗?
编辑:我知道我可以将 catch 语句中的错误参数分配给 throw new Error 而不是那个字符串,但我担心它可能会在我没有考虑到的情况下给出敏感信息。
【问题讨论】:
抛出特殊错误(例如new UserError
),然后在您的catch
块中转发这些错误
如何将该特殊错误转发到我的 catch 块?他们会在同一个范围内吗?
我打算重新扔它。只需if (error instanceof UserError) throw error; else throw new Error("Internal server error");
【参考方案1】:
我自己对 GraphQL 比较陌生,想出了一个临时的解决方案,在 UserType
中添加 2 个字段,一个称为 GraphQLInt 类型的 statusCode
,另一个是 GraphQLString 类型的 serverMessage
,然后以这种方式返回数据:
...payload
statusCode: 401,
serverMessage: "Could Not Verify Due To Some Error"
【讨论】:
您可以尝试对 try, catch 块抛出的异常类型进行分类。这是一个例子:***.com/a/1433608/6393618以上是关于GraphQL 如何在 node.js 中将服务器错误与客户端错误(最好使用 TryCatch 块)分开?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Node.js/Express 服务器调用 GraphQL API?
如何将 GraphQL 查询从 Node.js 发送到 Prisma
如何在 Node.js 中将 NTLM 凭据转换为 Kerberos 令牌
Node.js - 如何使用 graphql 获取关联的模型数据?