HttpClient post 不是 return 预期的类型
HttpClient post doesn't return expected type
我的后端正在以地图格式发送数据:
{
"key1": ["value1", "value2"],
"key2": ["value3"]
}
我使用HttpClient.post来获取数据。数据 returns 很好,但是当我尝试 data.get 时出现错误
this.http.post<Map<string, string[]>>(url, body).toPromise()
.then((data: Map<string, string[]>) => {
console.log(data);
console.log(data instanceof Map); // false
data.get('key1') // TypeError data.get is not a function
});
网络请求返回的数据将是一个普通对象,而不是Map
。
不过您可以将其转换为 Map
。 Map
采用键值对数组,因此您可以使用 Object.entries
:
this.http.post<Record<string, string[]>>(url, body).toPromise()
.then((data) => {
const dataMap = new Map(Object.entries(data))
dataMap.get('key1')
});
我建议不要使用 Promise。使用 observable,因为它更好调试并且具有更多功能。
http 构建了一个原始的 JSON 对象,您只能将其映射到具有字段的对象。不是方法。地图不像对象那样是模型。它是一个“功能对象”。构造函数也不会被触发
这意味着,即使你说它应该是一个地图,它实际上是一个 JSON 没有方法的对象。
出于这个原因,您应该通过管道将数据映射到地图。
this.http.post<object>(url, body)
.pipe( map(jsonObject => {
const map = new Map<string, string[]>();
for (const value in jsonObject) {
map.set(value, jsonObject[value]);
}
return map;
})
).subscribe(
(data: Map<string, string[]>) => {
console.log(data);
console.log(data instanceof Map); // true
data.get("key1");
},
error => console.log(error.error)
);
我的后端正在以地图格式发送数据:
{
"key1": ["value1", "value2"],
"key2": ["value3"]
}
我使用HttpClient.post来获取数据。数据 returns 很好,但是当我尝试 data.get 时出现错误
this.http.post<Map<string, string[]>>(url, body).toPromise()
.then((data: Map<string, string[]>) => {
console.log(data);
console.log(data instanceof Map); // false
data.get('key1') // TypeError data.get is not a function
});
网络请求返回的数据将是一个普通对象,而不是Map
。
不过您可以将其转换为 Map
。 Map
采用键值对数组,因此您可以使用 Object.entries
:
this.http.post<Record<string, string[]>>(url, body).toPromise()
.then((data) => {
const dataMap = new Map(Object.entries(data))
dataMap.get('key1')
});
我建议不要使用 Promise。使用 observable,因为它更好调试并且具有更多功能。
http 构建了一个原始的 JSON 对象,您只能将其映射到具有字段的对象。不是方法。地图不像对象那样是模型。它是一个“功能对象”。构造函数也不会被触发
这意味着,即使你说它应该是一个地图,它实际上是一个 JSON 没有方法的对象。
出于这个原因,您应该通过管道将数据映射到地图。
this.http.post<object>(url, body)
.pipe( map(jsonObject => {
const map = new Map<string, string[]>();
for (const value in jsonObject) {
map.set(value, jsonObject[value]);
}
return map;
})
).subscribe(
(data: Map<string, string[]>) => {
console.log(data);
console.log(data instanceof Map); // true
data.get("key1");
},
error => console.log(error.error)
);