#javascript #json #angular #angular-http
#javascript #json #угловой #angular-http
Вопрос:
Я использую Angular Http
для отправки в свой API, когда статус ответа равен 200, он анализирует его должным образом и выводит только мой ответ, как ожидалось, я обрабатываю это в рамках первого .then()
обещания, но когда в моем API появляется ошибка, я выдаю его со статусом 400 и пытаюсь обработать его через .catch()
блок.
Проблема, с которой я сталкиваюсь, заключается в том, что у .catch()
есть не только моя ошибка raw json из моего api, она просто не определена. Мой ответ об ошибке от моего API выглядит примерно так:
{
"status": 400,
"message": "Bad request",
"errors": [
{
"code": "IN_USE",
"message": "Email is in use",
"field": "email"
}
],
"data": []
}
Я убедился, что отправляю application/json
заголовки как с ответом 200, так и с ответом 400, поэтому я не уверен, почему мой код typescript не будет анализировать json на .catch()
Мой машинописный текст состоит из двух файлов, api
и user
пользователь просто расширяет api, чтобы использовать post()
созданный мной метод:
api.ts
/**
* POST to the API
* @param path Where to go
* @param params What to send
*/
public post(path, params): Promise<any> {
return this.http
.post(this.apiUrl path, params)
.toPromise()
.then(r => r.json());
}
user.ts
/**
* Registers a user and then logs them in via token
* @param name Users name
* @param email Users email
* @param password Users password
*/
register(name: string, email: string, password: string) {
this.post('/register', {
access_token: this.accessToken,
name: name,
email: email,
password: password
})
.then(r => {
// This logs the json just fine
console.log(r);
})
.catch(r => {
// This is undefined
console.log(r);
});
}
Комментарии:
1. В чем ошибка?
r
Действительно ли ссылается на объект, который имеет.json
функцию?2. для меня ответ выглядит правильным; это допустимый JSON.
3. @Ouroborus Мой API всегда возвращает JSON, просто статус равен 200 или 400. Я перевожу его в json в моем классе API
.then(r => r.json())
. Когда статус равен 400, он не выдает мне json, простоundefined
но когда статус ответа api равен 200, он отлично разбирается в json.4. Если ваш код состояния равен 400 (или любой другой код ошибки), то обещание в вашем методе post не анализируется, потому что
.then(r => r.json());
часть никогда не достигается.
Ответ №1:
Поскольку ваш запрос не выполняется (код состояния 400), он не пройдет через then
обратный вызов, он перейдет к catch
one, поскольку у вас его нет в post
методе, он перейдет к register
методу catch, поскольку вы не выполняли синтаксический анализ в json, это не будет json.
Попробуйте это:
public post(path, params): Promise<any> {
return this.http
.post(this.apiUrl path, params)
.toPromise()
.then(r => r.json())
.catch(e => throw new Error(e.json()));
}
Комментарии:
1.
TypeError: undefined is not an object (evaluating 'r.errors[0]')
Ответ №2:
Вы можете попробовать проверить наличие сообщений о состоянии в .then(r => )
разделе, а затем в соответствии со статусом вы можете продолжить свою логику.
register(name: string, email: string, password: string) {
this.post('/register', {
access_token: this.accessToken,
name: name,
email: email,
password: password
})
.then(r => {
// This logs the json just fine
if(r.status == 200){
console.log(r);
}
if(r.status == 400){
console.log(r);
}
})
.catch(r => {
// This is undefined
console.log(r);
});
}