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

Node.js Express中fetch内res.write()无响应及await与then差异问题

问题解答

核心原因:请求处理函数的执行时机与响应生命周期

写法1(无await)的问题

写法1里,sendText是async函数,但你没等待fetch的Promise链执行完成。这会导致:

  • sendText调用fetch后直接执行完毕,完全不等后续的.then回调运行
  • Express会判定当前请求已处理完成,自动调用res.end()关闭响应
  • 等后续.then回调里执行res.write('456')和res.end()时,响应早就被关闭,内容无法发送到前端,所以前端只收到"123"

写法2(加await)的作用

添加await后,sendText函数会暂停执行,直到整个fetch的.then链全部完成:

  • 包括res.write('456')和res.end()在内的操作,都会在响应关闭前执行完毕
  • Express不会提前结束响应,所有通过res.write发送的内容都能完整送达前端,所以前端能收到"123"+"456"

await与.then结合的差异

  • await是Promise的语法糖,它会等待目标Promise的状态变为resolved。如果await的是带有.then链的Promise,它会等整个.then链的所有回调都执行完成,才继续执行后续代码
  • 不加await的话,Promise链会在后台异步执行,但当前函数会直接结束,导致框架提前关闭响应
  • 重点提醒:在Express中,若请求处理函数执行完毕时你未显式调用res.end(),框架会自动帮你调用,这是写法1中响应被提前关闭的关键原因

补充:初始示例的额外问题

你最开始的代码里,.then回调用了逗号运算符:

.then((response) => {response.json(), res.write("456")})

逗号运算符只会返回最后一个表达式的结果(也就是res.write的结果),但response.json()返回的Promise根本没被等待,再加上没await导致响应提前关闭,所以"456"无法被前端接收

内容的提问来源于stack exchange,提问作者Tony Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:01:01