GraphQL, как обрабатывать сообщение об ошибке, когда ответ исходит от микросервиса - PullRequest
0 голосов
/ 31 октября 2018

У меня есть API, который при передаче недопустимого токена авторизации отвечает следующим образом:

Несанкционированный ответ:

{
   "status": "failure",
   "message": "Unauthorized" 
}

Но когда передается действительный токен, он отвечает массивом объектов, каждый из которых представляет документ следующим образом:

Авторизованный ответ:

[{
    "_id": "5bd8f520e68ba2003ec9f528",
    "user": "5bd8f50cced689002769d254",
    "title": "A title for a document",
    "content": "Some content for a document",
}, { 
    "_id": "5bd8f520e68ba2003ec9f528",
    "user": "5bd8f50cced689002769d254",
    ....
}]

Как изящно обрабатывать сообщения об ошибках в GraphQL, когда они происходят из моих микросервисов работает экспресс? и как мне охватить изменение структуры данных в ответе?

Мой резольвер:

const getDocuments = async context => {
  const config = {
    headers: {
      Authorization: context.token
    }
  };

  try {
    return await axios
      .get("http://document_service:4000/v1/documents", config)
      .then(response => {
        return response.data;
      })
      .catch(error => {
        return error.data;
      });
  } catch (err) {
    return err;
  }
};

const Query = {
  docServiceGetDocs: (obj, args, context) => getDocuments(context)
};

response.data вернет либо массив документов, либо объект со статусом и сообщением.

Моя схема:

type getDocuments {
  _id: String
  user: String
  title: String
  content: String
}

type Query {
  docServiceGetDocs: [getDocuments]
}

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

Я использую сервер Apollo 2

1 Ответ

0 голосов
/ 31 октября 2018

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

{
   "status": "failure",
   "message": "Unauthorized",
   "response": []
}

{
   "status": "success",
   "message": "",
   "response": [{ user: "Dan" }],
}

Но если это не легко исправить, вы можете просто проверить форму ответа внутри вашего резольвера:

const getDocuments = async context => {
  const config = {
    headers: {
      Authorization: context.token
    }
  };

  try {
    const response = await axios.get("http://document_service:4000/v1/documents", config)
    const data = response.data
    if (data && data.status === 'failure') {
      throw new Error(data.message)
    }
    return data
  } catch (err) {
    // example of how to handle axios errors

    let message = ''
    if (err.response) {
      // Status code out of the range of 2xx, format error message according
    } else if (err.request) {
      // The request was made but no response was received, format message accordingly
    } else {
      message = err.message
    }
    // throw whatever error you have so it's included in your graphql response
    throw new Error(message) 
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...