вернуть код состояния из graphql yoga - PullRequest
0 голосов
/ 17 мая 2018

Из graphql yoga внутри своих распознавателей я проверяю перед вызовом распознавателя, защищен ли этот распознаватель или нет.

Если распознаватель защищен, а пользователь не вошел в систему, я могу выдать ошибку, например: return new Error('Token is missing');

Это останавливает выполнение запроса и возвращает правильную форму сообщения с полем ошибки.

{
  "data": null,
  "errors": [
    {
      "message": "Token is missing",
      "locations": [
        {
          "line": 3,
          "column": 3
        }
      ],
      "path": [
        "users"
      ]
    }
  ]
}

Ответ имеет статус 200, что неверно. Я хотел бы иметь возможность выбрать свой собственный статус, например, 403.

Вот моя текущая реализация преобразователей:

const withAuth = authed => (_, args, context, ...rest) => {
    if (!context.token) {
        return new Error('Token is missing');
    }

    let result = null;

    try {
        result = jwt.verify(context.token, process.env.HASH);
    } catch (__) {
        return new Error('Incorrect token');
    }

    const { username, email } = result;
    if (!username || !email) {
        return new Error('Incorrect token');
    }

    return authed(_, args, { ...context, user: { username, email } }, ...rest);
};


const resolvers = {
    Query: {

        users: withAuth(resolver(User)), //get users from db

}

Я бы добавил промежуточное программное обеспечение перед запросом в экспрессе, но нет способа определить, какой запрос вызывается, поскольку все вызовы выполняются на одной и той же конечной точке.

Любой вклад будет оценен!

1 Ответ

0 голосов
/ 17 мая 2018

Согласно спецификации graphql, конечная точка всегда должна возвращать статус 200:

http://facebook.github.io/graphql/October2016/#sec-Errors

Запись об ошибках в ответе представляет собой непустой список ошибок, где каждая ошибка - это карта.

Если во время запрошенной операции не было обнаружено ошибок, ошибки ввода не должны присутствовать в результате.

Каждая ошибка должна содержать запись с ключевым сообщением со строкой описание ошибки, предназначенной для разработчика в качестве руководства по понять и исправить ошибку.

Если ошибка может быть связана с определенной точкой в ​​запрашиваемой Документ GraphQL, должен содержать запись с указанием ключевых мест со списком локаций, где каждая локация представляет собой карту с ключами строка и столбец, оба положительные числа, начиная с 1, которые описывают начало связанного элемента синтаксиса.

Серверы GraphQL могут предоставлять дополнительные записи об ошибке по своему усмотрению производить более полезные или машиночитаемые ошибки, однако в будущем версии спецификации могут содержать дополнительные записи об ошибках.

Если запись данных в ответе пуста или отсутствует, ошибки Запись в ответе не должна быть пустой. Он должен содержать хотя бы один ошибка. Содержащиеся в нем ошибки должны указывать, почему никакие данные не смогли быть возвращенным.

Если запись данных в ответе не равна нулю, запись ошибок в Ответ может содержать любые ошибки, которые произошли во время выполнения. Если ошибки, возникшие во время выполнения, они должны содержать эти ошибки.

...