#angular #typescript
#angular #typescript
Вопрос:
У меня есть эта функция
getAll<T>() {
return this.http.get(`${environment.apiUrl}/products`);
}
Я называю это так:
this.productService.getAll()
.pipe(first())
.subscribe(products => {
debugger
let s = products;
this.products = products.response;
});
Я получаю ошибку, подобную этой
Property 'response' does not exist on type 'Object'.ts(2339)
Ответ сервера может быть любым в этом формате:
{"status":200,"error":null,"response":[]}
{"status":200,"error":null,"response":{}}
{"status":200,"error":null,"response":"any string"}
Ответ №1:
Основная причина проблемы связана с тем, что ожидаемый тип возвращаемого объекта не указан в вызове http.get().
По умолчанию метод http.get() возвращает обычный JSON. Следовательно, прямая ссылка на внутреннее свойство (пример: json_data.response) вызовет ошибку типа.
Как решить проблему?
Проблему можно решить, присвоив возвращаемый тип http.get(), используя <>
Фрагмент рабочего кода
getAll: Observable<MyReturnType>() {
return this.http.get<MyReturnType>(`${environment.apiUrl}/products`);
}
this.productService.getAll()
.pipe(first())
.subscribe(products => {
let s = products;
this.products = s.response;
});
Дополнительная информация:
https://angular.io/tutorial/toh-pt6
Ответ №2:
попробуйте отладить это, выполнив:
this.productService.getAll()
.pipe(first())
.subscribe(products => {
console.log(products);
let s = products;
this.products = products.response;
});
Я думаю, что проблема может быть в вашем бэкэнде здесь
Если это не поможет, попробуйте принудительно ввести тип для ответа. вы можете сделать что-то вроде этого:
getAll() { return this.http.get<{status: number, error: any, response: any}>(${environment.apiUrl}/products); }
если все это не помогает, попробуйте исправить свой серверный сервер, чтобы отправлять вам только один тип (object)
вы никогда не должны возвращать массив в http-запрос.
Смотрите здесь:https://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx /
Ответ №3:
При подписке на HttpClient
текст ответа принимается напрямую (если не запрошено иное), как показано ниже;
this.productService.getAll().subscribe(body => this.products = body);
Кроме того, нет причин для использования first
оператора, поскольку все наблюдаемые, возвращаемые HttpClient
, завершаются при первом выпуске.