Аурелия | json анализирует неперехватываемое исключение?

Итак, я пытаюсь сделать этот почтовый запрос, следуя документам aurelia: http://aurelia.io/hub.html#/doc/article/aurelia/fetch-client/latest/http-services/3

А это просьба:

 httpClient.configure(config => {
        config
            .withBaseUrl(baseUrl)
    });
this.client = httpClient;
this.client.fetch(`/api/Register/${userName}`, {
            method: "post",
            body: json(loginInformation),
            headers: {
                'Access-Control-Allow-Origin' : '*',
                'Accept': 'application/json'
            }
        }) .then(response => this.safelyParseJSON(response))
            .then(data => this.setup(data));

где безопасностьParseJSON:

    safelyParseJSON(response) {
        var parsed
            try {
                parsed = response.json();
            } catch (e) {
            }

        return parsed 
    }

но я продолжаю получать эту ошибку:

"uncaught (в обещании) SyntaxError: неожиданный конец ввода JSON"

Кто-нибудь знает, что я делаю неправильно?

Примечание. Я получаю эту ошибку только при получении 404/500 от сервера, если результаты в порядке, это работает.

Примечание 2: я оборачиваю эту функцию внутрь try-catch, но это все еще не работает, оно не перехватывает исключение.

Примечание 3: я попытался заменить эту строку:

parsed = response.json();

с этой строкой:

parsed = JSON.parse(response);

Но чем ответ всегда undefined.


person Hay Zohar    schedule 22.07.2016    source источник
comment
Как выглядит возвращаемый json? Проверьте вкладку сети в инструментах разработчика.   -  person Ashley Grant    schedule 22.07.2016


Ответы (2)


проверьте статус ответа перед вызовом .json():

.then(response => {
  if (response.ok) {
    return response.json().then(data => this.setup(data));
  }
  return Promise.reject(response.text());
});
person Jeremy Danyow    schedule 22.07.2016

В итоге я использовал ответ Джереми Дэниоу с небольшим изменением:

.then(response => {
 if (response.ok && response.status === 200) {
   return response.json().then(data => this.setup(data));
 }
 return Promise.reject(response.text());
});

добавление проверки response.status было необходимо в моем случае, поскольку response.ok также был верным для кода состояния 204 (нет содержимого).

person Hay Zohar    schedule 22.07.2016
comment
Лично я бы не стал выдавать какую-либо ошибку в статусе ответа 204, обычно это метод DELETE, а не плохой ответ, а хороший, не содержащий информации. - person Randy; 28.11.2016