2026/9/23 6:56:49

109、流式输出与前后端交互

109、流式输出与前后端交互 109、流式输出与前后端交互那晚上线前调一个AI对话接口,后端日志明明每生成几个字就打一行,前端页面却像个傻子似的转圈,非要等整段话全部生成完才一次性蹦出来。我第一反应是前端用了普通axios,没开stream,结果一看代码没错,用的fetch。那问题大概率出在响应头或者代理上。打开DevTools一看,响应体压根没动,整个内容在结束前一直是空的。这台线上是nginx反代,我立刻想到会不会是proxy_buffering没关,加个proxy_buffering off;再试,果然OK。这事过后我认真捋了一遍流式输出和前端交互的整套玩法,发现坑不少,值得记一篇笔记。流式输出说白了就是后端把数据分块往客户端扔,而不是攒齐了再发。HTTP/1.1里有个Chunked Transfer Encoding,响应头带Transfer-Encoding: chunked,正文按块发,每块前面有长度标记。这样客户端就能在接收过程中逐步“看到”数据。但注意,Content-Length这时候不能用了,因为长度没法预先确定。很多框架会自动处理,比如Node.js里你res.write('一句话')再调用res.flushHeaders()或依赖框架的flush机制,数据才会真正冲出去。Python的Flask里yield配合Response那个generator也能做到,但前提是中间层别乱加缓冲。这里最容易踩的坑是Web服务器或代理开了gzip压缩,gzip会把整段数据压在一起再发,