Как разобрать ошибку, полученную от бэкэнда и отправленную как объект Error в javascript - PullRequest
0 голосов
/ 28 октября 2019

Наконец, проблема была в конструкторе объекта Error, который делает бесполезным объект ответа, передаваемый ему в обработчике ошибок catch.

Я использую SDK с такимМетод: ссылка на код SDK

    /**
     * Axios request
     * @param method Request method
     * @param url Server URL
     * @param requestConfig Custom Axios config
     */
    async request(method, url, requestConfig) {
        try {
            const response = await this.axios.request(Object.assign({ method,
                url }, requestConfig));
            return response.data;
        }
        catch (error) {
            if (error.response) {
                throw new Error(error.response.data.message);
            }
            else {
                throw error;
            }
        }
    }

Я пытаюсь разобрать ошибки, испускаемые этим методом. У меня нет проблем со вторым случаем - throw error; Но я не могу разобрать сообщение в первом случае - throw new Error(error.response.data.message);

Если я отлаживаю ошибку с console.log("Error: ", error);, я получаю Error: Error: [object Object] вconsole.

Если я отлаживаю console.log('sdk => error.response.data.message: ', error.response.data.message); в приведенном выше коде перед выдачей ошибки, он показывает это:

sdk => error.response.data.message:  
[{…}]
0:
messages: Array(1)
0: {id: "Auth.form.error.user.not-exist", message: "This email does not exist."}
length: 1
__proto__: Array(0)
__proto__: Object
length: 1
__proto__: Array(0) 

Возможно, проблема в том, что Error ожидает строку в своем конструкторе и, следовательно,, он выполняет метод toString () для объекта.

Это ответ, который я получаю, когда смотрю на вкладку СЕТЬ в средстве проверки:

{"statusCode":400,"error":"Bad Request","message":[{"messages":[{"id":"Auth.form.error.user.not-exist","message":"This email does not exist."}]}]}

И я могу только вывести это: error.message[0] Если я пытаюсь error.message[0].messages, я получаю неопределенное значение.

Если я пытаюсь: const errorToJSON = JSON.parse(error) Я получаю эту ошибку:

Unhandle Rejection (SyntaxError): Unexpected token E in JSON at position 0

Мне нужно текстовое значение сообщения: «Этого электронного письма не существует.»

Заранее благодарим.

Ответы [ 3 ]

0 голосов
/ 28 октября 2019

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

error - это объект, перехваченный при попытке / захвате

error.response - это объект, содержащий данные ответа

error.response.data - это JSON, который вы видите в качестве возвращаемых данных

error.response.data.message - это массив сообщений

В следующем коде, вы бросаете новый объект Error и передаете массив сообщений в конструктор. Причиной сбоя является то, что конструктору объекта Error требуется переменная типа String.

Один из вариантов решения этой проблемы - использовать JSON.stringify в массиве сообщений и передать его в конструктор объекта Error. Было упомянуто, что вы также можете просто бросить объект error.response.data.message. Вы сами должны выяснить, подходит ли какой-либо из этих или других вариантов для вашего проекта.

Вот пример использования метода stringify:

if (error.response) {
  throw new Error(JSON.stringify(error.response.data.message));
}

ВотПример создания массива сообщений:

if (error.response) {
  throw error.response.data.message;
}
0 голосов
/ 28 октября 2019

Как говорит epascarello , вы сможете получить сообщение об ошибке с помощью error.message[0].messages[0].message. Посмотреть демо:

const error = {"statusCode":400,"error":"Bad Request","message":[{"messages":[{"id":"Auth.form.error.user.not-exist","message":"This email does not exist."}]}]}

console.log(error.message[0].messages[0].message)

Вот почему это работает.

error      // The parent object your message is stored in
.message   // Get the `message` parameter from the object
[0]        // `message` is an array. Get the first object from the array
.messages  // Get the `messages` parameter from the object
[0]        // `message` is also an array. Get the first object from the array
.message   // Get the `message` parameter from the object

{                                                 <------ error
  "statusCode":400,
  "error":"Bad Request",
  "message":[                                     <------ .message
    {                                             <------ [0]
      "messages":[                                <------ .messages
        {                                         <------ [0]
          "id":"Auth.form.error.user.not-exist",
          "message":"This email does not exist."  <------ .message
        }
      ]
    }
  ]
}

Имейте в виду, что это будет работать, только если массивы message и messages содержат что-то вих. Если вы не уверены, вы можете использовать что-то вроде error.message.flatMap(msg => msg.messages.map(innerMsg => innerMsg.message))

0 голосов
/ 28 октября 2019

Если ответ возвращается в виде строки, вы можете использовать функцию Javascript JSON.parse() для преобразования его в объект JSON.

Как только ответ получен в формате JSON, вы можете просто получить значение с помощьюпрохождение через ответ:

var errorMessage = response.message[0].messages[0].message;
...