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 获取关联的模型数据?

如何在同一个项目Node.js中将一个GAE服务列入另一个白名单

node.js graphql/sequelize 服务器为链接属性返回 null