Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度5-';json不存在于类型对象';_Angular_Rxjs - Fatal编程技术网

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,
    );

  }