Как обрабатывать ошибки бэкэнда от Node/Koa на внешнем клиенте apollo-client

Мой интерфейс, использующий 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. Я не уверен, что вызывает это.

введите здесь описание изображения

Обратите внимание: неожиданная буква "а" совпадает с буквой "а" в ctx.throw(401, "access_denied"). Если бы вместо этого было ctx.throw(401, "x"), интерфейс вместо этого отображал бы "неожиданный токен x".

Код внешнего интерфейса, в котором возникают ошибки:

введите здесь описание изображения

Чтобы исправить это, я следовал документации по обработке ошибок и использовал apollo-link-error.

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(),
})

Результат отладки log в apollo-link-error выглядит следующим образом:

введите здесь описание изображения

Связанные документы

Кажется, у кого-то возникла идентичная ошибка, но решения нет в списке.


person Connorelsea    schedule 17.01.2018    source источник


Ответы (1)


Я обнаружил, что ошибки обрабатываются правильно во внешнем интерфейсе, когда я начал использовать эту библиотеку в бэкэнде: https://github.com/jeffijoe/koa-respond

Используя только ctx.unauthenticated()

Но я все же хотел бы узнать больше о том, как возвращать ошибки json/object с помощью koa без помощи плагина.

person Connorelsea    schedule 19.01.2018