Мой интерфейс, использующий 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
выглядит следующим образом:
Связанные документы
Кажется, у кого-то возникла идентичная ошибка, но решения нет в списке.