You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NEST.js技术疑问:异步服务方法未在控制器await却正常工作?

问题:异步服务方法无需await也能正常返回响应?

我正在学习构建一个用于博客的简易NEST API,文章以.txt文件形式存储。我实现了一个名为getTestFileAsJSON的服务方法,通过流读取.txt文件并返回JSON格式数据,代码如下:

async getTestFileAsJSON() {
    const text = { value: '' };
    const testFileAsReadableStream = createReadStream(
      join(process.cwd(), '/files/test.txt'),
    );

    const streamToString = async (stream) => {
      const chunks = [];
      for await (const chunk of stream) {
        chunks.push(Buffer.from(chunk));
      }
      return Buffer.concat(chunks).toString('utf-8');
    };
    const myText = await streamToString(testFileAsReadableStream);
    console.log(myText);
    text.value = myText;

    return JSON.stringify(text);
}

该方法为异步方法,但我在控制器中调用时未使用await却能正常获取响应,控制器代码如下:

@Get('json-file')
getStreamFile() {
  return this.blogService.getTestFileAsJSON();
}

我疑惑:是否因为代码中没有真正的异步操作,才导致无需await也能正常运行?


解答

你的代码里完全存在真正的异步操作——for await...of处理文件流、createReadStream读取本地文件都是I/O异步操作,和你想的刚好相反。

控制器不用手动加await也能正常工作的核心原因是:NestJS控制器原生支持返回Promise对象。当你返回一个Promise时,Nest会自动在内部帮你执行await,等待Promise完成后,再把resolve的结果作为响应返回给客户端。

换句话说,你现在的控制器写法和下面这种手动加await的写法效果完全一致:

@Get('json-file')
async getStreamFile() {
  return await this.blogService.getTestFileAsJSON();
}

Nest帮你省去了手动处理Promise的步骤,让代码更简洁。

另外提个小优化:你的服务方法最后返回JSON.stringify(text),但Nest默认会自动把返回的JavaScript对象序列化为JSON响应,所以你可以直接返回text对象,不用手动调用JSON.stringify,代码会更简洁。


内容的提问来源于stack exchange,提问作者slav.getov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 18:45:11