Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在前端apollo客户端上处理来自节点/Koa的后端错误_Javascript_Node.js_Reactjs_Koa_Apollo - Fatal编程技术网

Javascript 如何在前端apollo客户端上处理来自节点/Koa的后端错误

Javascript 如何在前端apollo客户端上处理来自节点/Koa的后端错误,javascript,node.js,reactjs,koa,apollo,Javascript,Node.js,Reactjs,Koa,Apollo,我的前端使用apollo client,当后端在请求后返回错误时引发异常 当节点服务器收到请求时,我使用koa中间件检查请求令牌的有效性。如果令牌有效,则将请求转发到下一个中间件。如果令牌无效,我想向客户端返回401访问拒绝错误。为此,我遵循了Koa的错误文档 我编写的错误处理中间件的代码: function userIdentifier() { return async (ctx, next) => { const token = ctx.request.headers.au

我的前端使用apollo client,当后端在请求后返回错误时引发异常

当节点服务器收到请求时,我使用
koa
中间件检查请求令牌的有效性。如果令牌有效,则将请求转发到下一个中间件。如果令牌无效,我想向客户端返回401访问拒绝错误。为此,我遵循了Koa的错误文档

我编写的错误处理中间件的代码:

function userIdentifier() {
  return async (ctx, next) => {
    const token = ctx.request.headers.authorization

    try {
      const payload = checkToken(token)
      ctx.user = {
        id: payload.userId,
        exp: payload.exp,
        iat: payload.iat,
      }
    } catch (error) {
      ctx.user = undefined
      ctx.throw(401, "access_denied")
      // throw new Error("access_denied")
    }

    await next()
  }
}
这似乎在后端有效,但在前端无效。当前端收到此错误时,会发生JavaScript运行时错误。我不确定这是什么原因造成的

注意,意外的“a”与在
ctx.throw(401,“拒绝访问”)
中找到的“a”相同。如果改为
ctx.throw(401,“x”)
则前端显示“意外令牌x”

发生错误的前端代码:

为了解决这个问题,我遵循并使用了阿波罗链接错误

const errorLink = onError(props => {
  const { graphQLErrors, networkError } = props
  console.log("ON ERROR", props)
  if (graphQLErrors)
    graphQLErrors.map(({ message, locations, path }) =>
      console.log(
        `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`
      )
    )
  if (networkError) console.log(`[Network error]: ${networkError}`)
})
然后我结合所有链接创建Apollo客户端,如下所示:

const link = ApolloLink.from([errorLink, authLink, httpLink])

export const client = new ApolloClient({
  link,
  cache: new InMemoryCache(),
})
阿波罗链路错误中调试日志的输出如下:

相关文档


似乎有人遇到了问题,但未列出解决方案。

我在后端开始使用此库时,发现前端的错误处理正确:

仅使用
ctx.unauthenticated()

<>但是我仍然想知道更多关于如何用膝关节炎来返回JSON/Objista错误,而不需要插件帮助< /P>