У меня есть службы, которые получают JSON от докера. Я хочу получить количество контейнеров.
Итак, я подписываюсь на свою услугу:
ngOnInit() {
this.docker.getContainers().subscribe(containers => {
console.info(containers.length);
});
}
Я получаю правильный ответ на консоли и все же получаю:
property length does not exist on type Object
Я делаю что-то неправильно?
export class DockerService {
private baseUrl:string = 'http://localhost:8080/api/docker';
private headers = new HttpHeaders({'Content-Type':'application/json'});
private options = new HttpHeaderResponse({headers:this.headers});
constructor(private _http:HttpClient) { }
getContainers() {
return this._http.get(this.baseUrl + "/containers", this.options);
}
getImages() {
return this._http.get(this.baseUrl + "/images", this.options);
}
}
отредактировал. это мой докер-сервис
Только console.infocontainers
Получаю массив из 5 элементов. это правильно.
Пожалуйста, прочтите как сделать воспроизводимый пример
Я поставлю json
Какой службой Http вы сейчас пользуетесь? старый Http или новый HttpClient?
HttpClient. Я использую Angular 6
@ user9793665, можете ли вы опубликовать возвратный json в containers?





Вы должны сопоставить свой ответ, попробуйте следующее:
getContainers() {
return this._http.get(this.baseUrl + "/containers", this.options).map(res => {
return res.json();
});
}
getImages() {
return this._http.get(this.baseUrl + "/images", this.options).map(res => {
return res.json();
});
}
Это зависит от того, какая версия angular OP используется, для более высоких версий и с новым HTTP-клиентом res.json() не требуется
свойство json не существует в типе Object
Я использую Angular 6. Я пробовал return this._http.get(this.baseUrl + "/containers", this.options).pipe(map(res => { return res.json(); }));
@ user9793665 в angular 6 res.json () не требуется, вы по умолчанию получаете json .. просто проверьте, является ли он объектом или массивом.
это объект.
тогда это не сработает, вам нужно получить доступ к свойству объекта, значение которого является массивом.
В основном angular не знает, какой тип возвращается вашим http-вызовом, поэтому он автоматически транслирует его в объект, который не имеет значения length. Чтобы он работал, вы должны привести его к тому, что вы ожидаете, в вашем примере, вероятно, это массив контейнеров.
getContainers(): Container[] {
return this._http.get<Container[]>(this.baseUrl + "/containers", this.options);
}
Таким образом, angular будет знать, чего ожидать, и атрибуты должны существовать. Это, конечно, зависит от класса Container, которого у вас, вероятно, нет. Самый простой способ - создать этот класс и определить его атрибуты для того, что возвращается из бэкэнда.
Однако, если по какой-то причине вы не хотите этого делать, вы, вероятно, можете просто сказать angular, что ожидаете массив any, который не обеспечивает безопасность типа, но, по крайней мере, у вас будет свой length attribute.
getContainers(): any[] {
return this._http.get<any[]>(this.baseUrl + "/containers", this.options);
}
Поскольку по умолчанию HttpClient получает ответ как объект, он не имеет этих свойств. Вы можете объявить контейнеры как любой[] и получить доступ к свойству длины.
ngOnInit() {
this.docker.getContainers().subscribe(containers : any[] => {
console.info(containers.length);
});
}
Так что измените код, как указано выше, и он будет работать
Вы должны использовать (контейнеры: любые []) при объявлении переменной:
ngOnInit() {
this.docker.getContainers().subscribe((containers: any[]) => {
console.info(containers.length);
});
}
24.03.2019
Угловой-7
Я получаю решение, используя ... Observable<any[]>
Пример:
getContainers(): Observable<any[]> {
return this._http.get<any[]>(this.baseUrl + "/containers", this.options);
}
У объекта нет свойства, такого как длина, но у объекта есть пара значений ключа, и в объекте будут конечные ключи, поэтому мы можем вызывать свойство длины для ключей объекта. Я попробовал следующий способ, и у меня это сработало.
ngOnInit() {
this.docker.getContainers().subscribe((containers: any[]) => {
console.info(Object.keys(containers).length);
});
}
покажите пожалуйста
containers