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
相关产品推荐
相关产品推荐

