Node.js使用pdfkit发送带图片PDF时报ERR_HTTP_HEADERS_SENT错误
问题原因
- 错误
Error [ERR_HTTP_HEADERS_SENT]本质是服务端在已经向客户端发送过响应头之后,再次尝试修改、发送响应头导致的冲突。 - 不带图片时PDF生成逻辑是同步执行的,你自定义的响应发送逻辑会先于Strapi默认的自动响应机制执行,因此可以正常运行。
- 当PDF包含图片资源时,PDFKit会异步加载、处理图片资源,PDF生成过程变为异步,Strapi的默认自动响应机制会先于你的PDF处理完成逻辑发送默认响应,等你PDF处理完成尝试写响应头时就会触发该错误。
解决方案
首先需要在路由处理函数最前端关闭Strapi的自动响应配置,告知Strapi你会手动处理响应的发送逻辑:ctx.respond = false。
推荐使用流管道的方式直接发送PDF,不需要手动收集buffer,效率更高也更稳妥,修正后代码如下:
// 路由处理函数内第一行添加,关闭Strapi自动响应 ctx.respond = false; var doc = new PDFDocument({ bufferPages: true, }), svg = mySvg; SVGtoPDF(doc, svg, 0, 0); // 提前设置响应头 ctx.res.writeHead(200, { "Content-Type": "application/pdf", "Content-disposition": "attachment;filename=file.pdf", }); // 直接将PDF流管道传输到响应对象 doc.pipe(ctx.res); doc.end();
如果你需要先拿到完整PDF数据再发送(比如需要做数据校验、额外加工等操作),只需要在原有代码最开头加ctx.respond = false即可,原有收集buffer的逻辑不需要修改。
内容的提问来源于stack exchange,提问作者Ajil Paul
相关产品推荐
相关产品推荐

