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

