在 Node.js 代理中保留二进制图片响应
通过 Node 正向代理流式转发二进制正文,仅在有意进行文本转换时才解码文本。
const { pipeline } = require('node:stream');
pipeline(upstreamResponse, clientResponse, (error) => {
if (error) console.error('Proxy response failed:', error);
});
在完成目标选择、向上游发起请求以及准备下游状态与响应头之后,再使用这条正文路径。Node 流通常提供 Buffer;对于图片或其他不需要改动的二进制内容,不要把它们累积成字符串。
pipeline 负责协调背压并传播错误。出错时它可能销毁目标,因此不要假定之后还能再发送一个 HTTP 错误响应。这段代码并不是完整的代理服务器。
对于直接透传的字节,应保留相关的表示元数据,例如媒体类型和内容编码,并通过转发规则处理与每一跳相关的字段。gzip 字节与对应响应头的对比展示了编码表示与解码表示之间的取舍。
有意的 HTML 改写需要另一条路径:识别其媒体类型,处理压缩与字符集,转换文本,并为新的字节生成元数据。旧的 Content-Length 无法描述已经改变的正文。
Buffer.concat 在需要完整缓冲时可以保住二进制内容,但会把整个正文放在内存中。直接透传的图片流不需要付出这种代价。