我最近在Express应用程序中发现了一个错误,它在某些情况下会生成错误并导致某个nodejs崩溃。
我为某个应用程序端点配置了以下剪辑(例如GET / pdf)
app.get('/pdf/',function(req, res) {
myPdfBuilder.buildPdf(pdfOptions, function(doc,err) {
if (err) {
res.status(500); res.end("Error");
}
else {
res.contentType("application/pdf");
res.attachment("my.pdf");
doc.output(function(out) {
res.end(out, 'binary');
}
}
}
});
buildPdf函数使用pdfkit(0.1.9)呈现PDF对象,然后将其读取并将输出发送到res(也称为“响应”)。
如果我访问端点,则PDF已成功下载。我看到设置了响应标头:
Connection: keep-alive
content-disposition: attachment; filename=my.pdf
content-type: application/pdf
但如果我尝试第二次下载,该应用程序有一个例外:
http.js:692
throw new Error('Can\'t set headers after they are sent.');
堆栈跟踪包含对res.contentType("application/pdf")
知道为什么应用程序在下载对象的第二个请求上崩溃了吗? nodejs进程锁定并且必须被杀死并重新启动(SIGKILL,SIGTERM什么都不做)。
express是版本2.5.11,带有连接1.9.2