【问题标题】:Error: write EPIPE on sendFile()?错误:在 sendFile() 上写入 EPIPE?
【发布时间】:2015-08-17 08:48:00
【问题描述】:

我正在使用 html-pdf 模块生成 pdf,使用以下代码:

var ejs = require('ejs');
var fs = require('fs');
var pdf = require('html-pdf');

var build = function (template, data) {
    var html = ejs.compile(fs.readFileSync(template, 'utf8'));
    html = html(data);

    return html;
}

pdf.create(build('views/print_templates/pm_export_pdf.ejs',
                {rows:resolve(rows, user_rows, table_rows,
                 subproject_rows, milestone_rows, release_rows)}), pdfconfig)
.toFile(function (err, pdf) {
    if (err)
        return console.log(err); 

    res.sendFile(pdf.filename);
});

PDFconfig 是 html-pdf 的配置变量。而resolve 是我自己的 db resolve 函数,在这个故事中不是很相关。

当我在我的 MacBook Pro 上的 OSX 10.10 上本地运行它时,它就像一个魅力。但是当我在我的服务器(centOS)上运行它时,我收到以下错误:

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: write EPIPE
    at errnoException (net.js:904:11)
    at Object.afterWrite (net.js:720:19)

这可能与权限有关吗?我不确定我做错了什么..

我运行以下版本:

  • 节点:0.10.31
  • 快递:4.10.7
  • html-pdf:1.2.0

【问题讨论】:

  • 您是在服务器上作为独立的 Node 进程运行您的应用程序,还是通过代理/nginx/Apache/...?
  • 我使用 nodemon 作为独立进程运行它。我也尝试以 sudo 运行该进程,但没有成功。
  • EPIPE 建议一侧(可能是客户端)在文件仍在发送时正在关闭连接。您使用的是 4.10 之前的 Express 版本吗?如果是这样,this issue 可能是导致您的问题的原因。
  • 感谢您的努力,我确实已经发现了这个问题,我使用的是 Express 4.10.7 版本。但是,如果这是问题所在,为什么这只会发生在 CentOS 服务器上?我使用与我在本地计算机上使用的所有内容完全相同的版本。
  • OS X 和 Linux 之间的差异足以导致这些问题。您是否尝试过在大型静态​​(不是由html-pdf 生成)文件上使用res.sendFile(),看看效果是否更好?

标签: javascript node.js pdf sendfile


【解决方案1】:

为了将来的目的:

我认为我必须重建我的节点模块。我想我不小心将 node-modules 文件夹复制到了 centOS 上的测试服务器,而 phantomjs 已经为 OSX 构建了它的依赖项。我仍然不确定它给通讯员带来的错误是如何产生的,但它修复了它。

还要确保您已安装 FreeType 和 fontconfiglib。

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多