【问题标题】:NestJs Async controller method vs calling await / async inside a methodNestJs Async 控制器方法与在方法中调用 await / async
【发布时间】:2021-06-11 23:20:50
【问题描述】:

我对 NodeJs 和 NestJs 有点陌生。我一直想知道在控制器中使用异步作为方法返回类型与在常规方法中执行异步操作有什么区别?如果此 API 上有大量流量(例如 40K req/min),NodeJs 如何在这两种情况下处理请求。它会在第二个示例中阻塞而在第一个示例中是非阻塞还是以类似的方式工作?

例如:

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

  @Post()
  async sample() {
    return "1234";
  }
}

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

  @Post()
   function sample() {
    return await methodX();
  }
  
  async function methodX(){
      return "1234"
  }

忽略 sample() 和 methodX() 中的内容仅作为示例。

【问题讨论】:

  • 我认为您的第二个示例应该从 return 语句中删除“await”关键字,以使您的问题清晰并且代码在语法上正确。
  • 请注意,return await 在语法上是正确的。但是那里的用法没有用,因为sample方法中没有错误处理。

标签: node.js async-await nestjs


【解决方案1】:

首先,将方法标记为async 使您可以在其中使用await 关键字。

例如在您提供的第二个示例中,您需要将方法sample 标记为asyncawait methodX

@Post()
async function sample() {
  // Now `await` can be used inside `sample`
  return await methodX();
}

所以回答你的问题

在控制器中使用异步作为方法返回类型与在常规方法中执行异步操作有什么区别?

没有。在这两种情况下,控制器的方法都需要标记为async。在方法体中执行路由应该执行的操作或在另一个async 方法中提取它只是代码组织的问题。

在第二个例子中是阻塞的,在第一个例子中是非阻塞的还是会以类似的方式工作?

这两个例子的工作方式相似。


其次,将方法标记为async 实际上不会使其异步,如果在其主体中没有执行真正的异步操作,例如对另一个服务的请求或setTimeout。这意味着以下示例

// Sample 1
@Post()
async sample() {
  return "1234";
}

// Sample 2
@Post()
function async sample() {
  return await methodX();
}
  
async function methodX(){
  return "1234"
}

都等价于同步方法

@Post()
syncSample() {
  return "1234";
}

最后,正如@Micael Levi 所说,return await 在语法上是正确的,但应该避免使用。考虑这个样本:

@Post()
function async sample() {
  return await methodX();
}
  
async function methodX(){
  throw new Error('something failed')
}

因为方法samplereturn awaitmethodXsample不会出现在堆栈跟踪中,这使得调试更加困难。

我们更喜欢这个样本:

@Post()
function async sample() {
  const result = await methodX();

  return result;
}
  
async function methodX(){
  throw new Error('something failed')
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 2021-05-02
    • 2015-04-06
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    相关资源
    最近更新 更多