【问题标题】:Why do you need to await app.listen() for nestjs为什么需要 await app.listen() for nestjs
【发布时间】:2021-04-28 05:49:57
【问题描述】:

对不起,如果这是一个愚蠢的问题,我不明白为什么在嵌套中你需要等待 app.listen(),当它是 bootstrap() 做的最后一件事时有什么意义

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

【问题讨论】:

  • 因为它做了一些异步的东西。如果你的问题是,什么异步?那你应该问nestjs的合作者,他们会给你更准确的信息......
  • @Nur 是的,但不是等待仍然是多余的吗?和把 app.listen(3000).then(e => {});从字面上告诉它在承诺解决后什么都不做,你确定这不仅仅是“最佳实践”之类的事情吗?
  • 为什么会这样?有原因,比如从磁盘读取,启动时需要做...
  • @Nur 因为无论等待承诺都会开始吗?就像所有 await 在这里所做的一样,就是说“在承诺解决后什么都不做”
  • app.listen 是否会返回一个承诺?如果是,什么时候解决?在此示例中,不需要它,因为您也不是 awaiting bootstrap。但是如果 app.listen 返回一个承诺,例如当应用停止收听时解析,然后它可能有用(例如,在拆卸后做某事)。

标签: typescript ecmascript-6 nestjs


【解决方案1】:

假设您使用以下命令通过终端运行应用程序:

 yourApp start

想象一下这个命令将在本地启动一个节点服务器。在代码的命令行部分,你的代码必须有这样的东西

try{
// this has to be async
start the server here
}
catch(e){
  console.log(e.message)
  process.exit(1);
}

现在,如果app.listen 是一个同步函数,当try 块运行时,app.listen 不会在那个时候抛出任何错误,所以我们永远不会捕捉到那个错误。即使端口正在使用中,我们也不会收到“EADDRINUSE”消息。

但如果app.listen 是异步代码,我们会捕获错误并将其显示给终端用户。否则,命令运行后应用程序会出现问题,用户将不知道发生了什么,并且永远不会再次使用同一个应用程序。

【讨论】:

    猜你喜欢
    • 2017-10-26
    • 2019-05-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多