从HttpModule中可观察到的RxJS检索数据

从HttpModule中可观察到的RxJS检索数据,rxjs,axios,observable,nestjs,Rxjs,Axios,Observable,Nestjs,我无法理解如何在NestJS应用程序中映射HttpService的数据属性。据我所知,这个可观察的只是包装了axios。下面是一些示例代码: interface Todo { task: string, completed: false } import { Injectable, HttpService, Logger, NotFoundException, } from '@nestjs/common' import { map } from 'rxjs/ope

我无法理解如何在NestJS应用程序中
映射
HttpService
的数据属性。据我所知,这个
可观察的
只是包装了
axios
。下面是一些示例代码:

interface Todo {
   task: string,
   completed: false
}

import {
  Injectable,
  HttpService,
  Logger,
  NotFoundException,
} from '@nestjs/common'
import { map } from 'rxjs/operators

async getTodo(todoUrl: string): Todo {
   const resp = this.httpService
      .get('https://example.com/todo_json')
      .pipe(map(response => response.data)) // map task/completed properties?
   return resp
}
resp
在这种情况下似乎属于
可观察的类型。如何在此请求中使用
map
仅检索所需的数据属性,以返回我的
Todo
界面?

查看您的代码:

import { map } from 'rxjs/operators' 

async getTodo(todoUrl: string): Todo {
   const resp = this.httpService
      .get('https://example.com/todo_json')
      .pipe(map(response => response.data)) // map task/completed properties?
   return resp
}
getTodo
返回一个可观察的,而不是响应。因此,您的返回值应该是可观察的

代码应该更像这样:

  getTodo(): Observable<Todo> {
    return this.http.get<Todo>('https://example.com/todo_json')
      .pipe(
        map(response => response.data),
        catchError(this.handleError)
      );
  }
getTodo():可观察{
返回此.http.get('https://example.com/todo_json')
.烟斗(
映射(response=>response.data),
catchError(this.handleError)
);
}
编辑:您不能仅仅从这个方法返回数据,因为它是异步的。它还没有数据。该方法返回一个可观察的。。。这基本上是一个合同,说明它将(稍后)为您返回数据。

查看您的代码:

import { map } from 'rxjs/operators' 

async getTodo(todoUrl: string): Todo {
   const resp = this.httpService
      .get('https://example.com/todo_json')
      .pipe(map(response => response.data)) // map task/completed properties?
   return resp
}
getTodo
返回一个可观察的,而不是响应。因此,您的返回值应该是可观察的

代码应该更像这样:

  getTodo(): Observable<Todo> {
    return this.http.get<Todo>('https://example.com/todo_json')
      .pipe(
        map(response => response.data),
        catchError(this.handleError)
      );
  }
getTodo():可观察{
返回此.http.get('https://example.com/todo_json')
.烟斗(
映射(response=>response.data),
catchError(this.handleError)
);
}

编辑:您不能仅仅从这个方法返回数据,因为它是异步的。它还没有数据。该方法返回一个可观察的。。。这基本上是一个合同,说明它将(在稍后的某个时间)为您返回数据。

默认情况下,Nest将为您订阅observable,并从您的服务返回observable。在这种情况下,你可以这样做

@Injectable()
将类导出到服务{
构造函数(私有只读http:HttpService){}
getTodos(todour:string):可观察{
返回这个.http.get(todour.pipe)(
映射(响应=>响应数据),
);
}
}
只要有一个控制器类调用this.todosrivce.getTodos(todour)
并返回它,就会发出响应

但是,如果您想在更习惯于它们的情况下做出承诺,您可以将
.toPromise()
方法附加到可观察链上,现在它是可等待的(尽管它会更慢,因为它必须等待可观察链发出完整的事件)

.toPromise()
示例:

@Injectable()
将类导出到服务{
构造函数(私有只读http:HttpService){}
getTodos(todour:string):Todo{
const myTodo=wait this.http.get(todour.pipe)(
映射(响应=>响应数据),
).toPromise();
返回myTodo;
}
}

默认情况下,Nest将为您订阅可观察内容,并从您的服务中返回可观察内容。在这种情况下,你可以这样做

@Injectable()
将类导出到服务{
构造函数(私有只读http:HttpService){}
getTodos(todour:string):可观察{
返回这个.http.get(todour.pipe)(
映射(响应=>响应数据),
);
}
}
只要有一个控制器类调用this.todosrivce.getTodos(todour)
并返回它,就会发出响应

但是,如果您想在更习惯于它们的情况下做出承诺,您可以将
.toPromise()
方法附加到可观察链上,现在它是可等待的(尽管它会更慢,因为它必须等待可观察链发出完整的事件)

.toPromise()
示例:

@Injectable()
将类导出到服务{
构造函数(私有只读http:HttpService){}
getTodos(todour:string):Todo{
const myTodo=wait this.http.get(todour.pipe)(
映射(响应=>响应数据),
).toPromise();
返回myTodo;
}
}

异步函数需要返回承诺,您可以调用toPromise对可观察对象返回承诺

async getTodo(todoUrl: string): Todo {
   const resp = this.httpService
      .get('https://example.com/todo_json')
      .pipe(map(response => response.data)) // map task/completed properties?
   return resp.toPromise();
}

异步函数需要返回一个承诺,您可以调用toPromise来返回一个承诺

async getTodo(todoUrl: string): Todo {
   const resp = this.httpService
      .get('https://example.com/todo_json')
      .pipe(map(response => response.data)) // map task/completed properties?
   return resp.toPromise();
}

你必须订阅可观察的。你必须订阅可观察的。我知道它返回一个可观察的。也许我需要让我的问题更清楚-我只想根据问题中指定的接口返回Todo。我不希望返回一个可观察的。我想从可观测数据中检索该数据,并按照方法界面的建议返回该数据。如何导入
map
?我更新了上面的示例。。。但在前面的回答中,似乎已经有人回答了您的问题。我知道它返回了一个可观察的结果。也许我需要让我的问题更清楚-我只想根据问题中指定的接口返回Todo。我不希望返回一个可观察的。我想从可观测数据中检索该数据,并按照方法界面的建议返回该数据。如何导入
map
?我更新了上面的示例。。。但是,在前面的回答中,似乎有其他人已经回答了您的问题。在NestJS文档中,它建议框架为您订阅可观察对象的位置在哪里?还有,有没有一种方法可以只返回
Todo
,返回我想要的属性,而不返回可观察的属性呢。正如我所说的,如果您只想返回
Todo
接口而不返回可观察对象,请在
.toPromise()
上附加一个
.toPromise()
并等待可观察对象,将其设置为某个常量(您仍然可以执行
映射
管道
操作)。然后你可以
返回myTodo。我会做一个更新,以显示这是伟大的。介意我问一下如何使用map来检索属性吗