【问题标题】:NestJS async await requirementNestJS 异步等待要求
【发布时间】:2021-10-08 07:48:30
【问题描述】:

我是第一次尝试 NestJS。

问题很简单,当我不在控制器中使用 async await 时,我可以在没有 await 的情况下返回数据,因为存储库类方法中使用了 async/await

  @Get('/:id')
  getMessage(@Param('id') id: string) {
    const messageId = id;
    // works just fine ????
    const message = this.messagesService.findOne(messageId);
    return message;
  }

但是当我使用 NEST 中的 NotFoundException 来确保我是否找到了我应该返回的数据时,我不得不使用 async/await,因为没有它,它认为message 始终存在。我假设这是一个承诺。

  @Get('/:id')
  async getMessage(@Param('id') id: string) {
    const messageId = id;
    // ???? await
    const message = await this.messagesService.findOne(messageId);
    if (!message) {
      throw new NotFoundException('Message with ID not found');
    }
    return message;
  }

如果我不使用 await,它不会抛出异常。

问题是,为什么/如何在不使用 await 的情况下在第一个示例中工作

【问题讨论】:

  • findOne 在做什么?它是如何返回结果的?
  • 是返回结果对象
  • 返回结果是异步还是同步、承诺还是简单对象还是数组?问题中缺少这些信息。
  • 请添加findOne函数的实现。
  • 在你的第一个例子中只是控制台message,它会清除一切。

标签: node.js typescript async-await nestjs


【解决方案1】:

await 关键字返回一个 Promise。因此,如果你返回一个 Promise,你就满足了返回一个 Promise 的合同。

我认为 Nest.js 存储库方法需要返回一个 Promise。你有两个选择。使用 async 关键字或返回 Promise。 在第一个示例中,您返回了一个 Promise,这就是它起作用的原因

请注意,如果您不想使用async,则无需使用。你总是可以去老学校。这是您的第一个示例与检查消息的逻辑一样:

@Get('/:id')
getMessage(@Param('id') id: string) {
  const messageId = id;
  // works just fine ?
  const promise = this.messagesService.findOne(messageId).then((message) => {
      if (!message) {
        throw new NotFoundException('Message with ID not found');
      }
      else {
        return message;
      }
  });
  return promise;
}

【讨论】:

    【解决方案2】:

    我们知道在JS中,程序是同步运行的,findOne是浏览器提供的一个webAPI。因为它是一个webapi,它会首先发送该行

    const message = this.messagesService.findOne(messageId);
    

    到 api 并在收到所有数据后再次将该函数返回到堆栈。 (假设你知道事件循环和 api 在 JS 中是如何工作的)

    • 在第一个函数中,您没有检查变量消息(如果它是 true 或 false),您只是返回值,因此只有在值存在时才会返回。
    • 但是在第二个函数中,您正在检查 var 消息,如果该行是在没有 await 的情况下编写的,它将直接转到“if”语句,甚至在当时从 api(findOne) 接收到数据之前消息 var 会仍然是未定义的。所以一旦你写了 await,除非收到来自 api 的回答,否则堆栈不会进入下一行,并且你的 if 语句将被完美地检查。

    【讨论】:

      【解决方案3】:

      您的问题的答案在于 nestjs/node 本身的架构。如果您返回一个承诺(您的第一个案例),它会解决它,然后返回该值。 2018 年 8 月 3 日在this 问题上更清楚地了解此检查 jiripospisil。

      【讨论】:

        猜你喜欢
        • 2021-11-23
        • 2020-11-10
        • 1970-01-01
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 2016-07-07
        • 2016-03-25
        相关资源
        最近更新 更多