1

我在 node.js webapp 中使用 Prawn PDF 即时生成 PDF 并将其发送回用户。只要 PDF 文档中没有图像,它就可以正常工作。当我在 pdf 中包含图像(png 或 jpeg)时,生成的节点子进程永远不会收到“退出”消息。

在 shell 中运行时,相同的 ruby​​ 脚本会按预期输出带有图像的 pdf。不知何故,图像数据在通过标准输出发送时似乎变得一团糟!我必须逃避它吗?

谢谢,马诺

var spawn = require('child_process').spawn;
var child = spawn('ruby', ['print_scripts/print.rb', doc_id]);
var pdf = '';

child.stdout.on('data', function(data){
    if(data.toString() != 'ERROR'){
    pdf += data;
    }
});
child.on('exit', function(code){
    res.setHeader('Content-Type', 'application/pdf');
    if(code == 0){
    res.send(pdf);
    }
});
4

1 回答 1

2

在我做的一个简单测试中,exit甚至在被调用之前data就被调用了。这可能与此通知有关:“请注意,子进程 stdio 流可能仍处于打开状态。” (这可能意味着内部缓冲区中仍有数据需要读取)。

当您不使用图像时,输出可能足够小以适合单个缓冲区,因此不会出现问题。而不是exit你应该抓住这个close事件。

在您的代码 ( pdf += data) 中还存在隐式转换为字符串的问题,这也可能导致问题。

我认为这会起作用:

var chunks = [];

child.stdout.on('data', function(data) {
  // insert error check here...
  chunks.push(data);
});
child.on('close', function() {
  var pdf = Buffer.concat(chunks);
  res.send(pdf);
});
于 2013-05-14T12:07:40.857 回答