Angular 角度5-';json不存在于类型对象';
我遵循一个简单的指南,并根据我的需要对其进行了轻微的修改-但我最终遇到了一个关于Angular 角度5-';json不存在于类型对象';,angular,rxjs,Angular,Rxjs,我遵循一个简单的指南,并根据我的需要对其进行了轻微的修改-但我最终遇到了一个关于映射和订阅 -这是指南,在我构建完列表服务后开始构建应用程序之前,一切都在运行 由于Angular 5的原因,我做了一些修改,比如用HttpClient替换,但没有什么不寻常的地方 我目前的问题涉及以下两个功能: public getAllTasks():Observable<Task[]> { let URI = `${this.serverApi}/tasks/`; return
映射
和订阅
-这是指南,在我构建完列表服务后开始构建应用程序之前,一切都在运行
由于Angular 5的原因,我做了一些修改,比如用HttpClient替换,但没有什么不寻常的地方
我目前的问题涉及以下两个功能:
public getAllTasks():Observable<Task[]> {
let URI = `${this.serverApi}/tasks/`;
return this.http.get(URI)
.map(res => res.json())
.map(res => <Task[]>res.tasks);
}
public deleteTask(taskId : string){
let URI = `${this.serverApi}/tasks/${taskId}`;
let headers = new HttpHeaders;
headers.append('Content-Type', 'application/json');
return this.http.delete(URI, {headers})
.map(res => res.json());
}
在这两个函数中都不起作用,会说:类型“Object”上不存在属性“json”。
我搜索了一下,找到了一些老帖子,上面有一些建议,比如修改为
.map((res: Response) => res.json())
但这给了我一个非常类似的错误
A function whose declared type is neither 'void' nor 'any' must return a value.
我的模型是:
export interface Task {
_id?: string;
title: string;
description: string;
category: string;
}
最初这是一个类,但我按照建议将其修改为一个接口。我不确定这是否有关联
不确定它是否是相对的,但它的组件端是:
ngOnInit() {
this.loadTasks();
}
public loadTasks() {
this.taskServ.getAllTasks().subscribe(
response => this.tasks = response,
)
}
我想这是我对map
的工作原理或它的预期的一些困惑。如有任何意见,将不胜感激
更新
正如本文所提到的,HttpClient似乎本机返回JSON格式的res,因此实际上删除这些行会删除错误。一旦我证明了我的完整解决方案,我将发布它。使用HttpClient,您可以直接按如下方式执行
public getAllTasks(): Observable<Task[]> {
const URI = this.serverApi + '/api/task/';
console.log(`Fetching all tasks from ${URI}...`);
return this.http.get(URI).map(res => res.tasks)
}
使用HttpClient,您不需要map(res=>res.json())
您可以从json获取数据,如下所示:
publicGetAllTasks():可观察{
让URI=`${this.serverApi}/tasks/`;
返回这个.http.get(URI);
}
看
在调用服务的组件中,您可以订阅异步数据:
导出类TestComponent实现OnInit{
任务:任务[];
构造函数(专用taskService:MyTaskService){
}
ngOnInit():void{
this.taskService.getAllTasks().subscribe((数据:Task[])=>{
这个任务=数据;
});
}
//其他方法
}
在列出任务的HTML中,应该使用可选的链接操作符{{tasks?.length},以避免浏览器控制台中可能出现的错误。我的答案在于,映射响应的方式略有不同
public getAllTasks():Observable<Task[]> {
let URI = `${this.serverApi}/tasks/`;
return this.http.get<{tasks: Task[]}>(URI)
.map(res => res.tasks)
}
确保您使用的是angular 4.3和upper
如果您使用的是angular 4.3及更高版本,则必须使用
从'@angular/common/http'导入{HttpClient}代码>
在这种情况下,您不必使用.map(res=>res.json())
,因为新的http将自动从json转换为对象
如果您使用的是angular 4.3 lower,则必须使用
从'@angular/Http'导入{Http}代码>
在这种情况下,使用.map(res:Response=>res.json())
将此代码示例.map((res:Response)=>res.json())用作.map(res=>res.json())
我尝试了这一点,但在const tasks
行-“类型Object上不存在json”@Sajeetharan,如果类型Object上不存在任务,则会出现错误。如何让它作为数组返回?是JS操作,还是我缺少一个合适的映射/订阅方法?(目前由于只有一个对象-没有数组,所以出现了一个错误)目前您如何获得响应?对象我能看看你的日志吗?或者更好的是,这是一个可以共享的公共项目吗?我想克隆并仔细看看。我真的不擅长查看代码并给出答案:)我使用HttpClient,但我得到一个错误,即类型“Object”上不存在“Property”auth_token“。`将其用作.map(res=>{//login successful,如果(!res.auth_token)返回,则响应中有jwt token;
可能重复的
loadTasks() {
this.taskServ.getAllTasks().subscribe(taskList => {
this.tasks = taskList;
});
}
public getAllTasks():Observable<Task[]> {
let URI = `${this.serverApi}/tasks/`;
return this.http.get<{tasks: Task[]}>(URI)
.map(res => res.tasks)
}
public loadTasks() {
this.taskServ.getAllTasks().subscribe(
response => this.tasks = response,
);
}