【问题标题】:Get object key-value pairs from AxiosResponse in NestJS从 NestJS 中的 AxiosResponse 获取对象键值对
【发布时间】:2022-01-09 01:16:04
【问题描述】:

我正在开发一个用于学习目的的小型 NestJS 应用程序。

我正在使用@nestjs/axios,正如文档所建议的那样。我可以通过以下解决方案访问数据库(并执行所有 CRUD 操作)并将数据发送回客户端:

async getUser(username: string): Promise<Observable<AxiosResponse<{ _id: string; _rev: string; email: string; name: string }>>> {
  return this.httpService.get(`${environment.cloudantBaseUrl}/users/${username}`).pipe(map((response) => response.data));
}

我需要从此响应数据对象中获取电子邮件键值对,但是当我尝试访问它时,我收到以下错误:

“可观察”类型上不存在属性“电子邮件”>'。

我试过这样:

const user = await this.getUser(username);

console.log(user.email);

当我将用户常量记录到控制台时,我得到了这个签名:

Observable {
  source: Observable { _subscribe: [Function (anonymous)] },
  operator: [Function (anonymous)]
}

所以我的问题是:如何从 AxiosResponse 对象中提取某些键值对?

提前致谢!

【问题讨论】:

    标签: axios nestjs


    【解决方案1】:

    有几点:

    1. 直接使用 Observable 时无需使用async/await。如果你想要async/await,你需要将 Observable 包装在lastValueFrom() 中以使其成为一个承诺。如果你不使用lastValueFrom,你可以在方法声明中删除async,在返回类型中删除Promise&lt;&gt;

    2. 由于您已经在映射响应,因此您不应该使用AxiosResponse&lt;&gt;。就做Observable&lt;{ _id: string; _rev: string; email: string; name: string }&gt;

    3. 要在后面的函数中使用 Observable,你只需要继续使用 .pipe() 和 rxjs 运算符,如 mapswitchMaptaplearnrxjs.io 是了解这些运营商可以做什么的好资源。

      1. 当你想记录一个 observable 的值时,你可以使用tap 操作符。 .pipe(tap(console.log)) 是它的快速绑定

    【讨论】:

    • 谢谢。现在我可以从 response.data 对象访问键值对,但不幸的是,我无法将这些值保存在范围之外以供以后使用。你能建议一种方法吗?
    • 为什么需要将其保存在作用域之外?就像我说的,如果你使用 observables,你会在 observable 管道内做所有事情。
    • 我需要对响应数据进行一些条件检查。然后我想在这个函数中返回一个完全不同的值,具体取决于检查。
    • 所以要么在可观察管道中使用map 运算符(我链接到的网站上有几个你可以使用的运算符的很好的例子),要么将其转换为承诺并使用@987654337 @就像我在第一点说的那样。
    • 谢谢!我已经把它变成了一个承诺,就像一个魅力。
    猜你喜欢
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多