2

我正在尝试创建一个节点服务器,该服务器提供使用 node-wkhtml 模块生成的 png 图像(基本上只是 wkhtmltoimage/wkhtmltopdf 命令行实用程序的包装器)。这是我到目前为止所拥有的:

var http = require('http');
var Image = require("node-wkhtml").image();

http.createServer(function (request, response) {
  new Image({ url: "www.google.com" }).convert (function (err, stdout) {
    //var theImage = new Buffer (stdout, 'binary');
    response.writeHead(200, {'Content-Type' : 'image/png',
                           'Content-Length' : stdout.length
    });
    response.write (stdout, 'binary');
    response.end ();
    //write out an error, if there is one
    if (err)
      console.log (err);
  });
}).listen(8124);

基本上,模块调用命令:

wkhtmltoimage www.google.com -

然后生成一个 png 图像并将其写入标准输出。提供的数据量似乎是正确的,但我无法让浏览器显示它(如果我将它作为文件下载也不起作用)。我尝试了以下命令:

wkhtmltoimage www.google.com - > download.png

果然,download.png 已创建并包含 google 主页的快照,这意味着 wkhtmltoimage 实用程序正常工作,并且该命令有效。我是节点的初学者,所以我不太熟悉如何提供这样的二进制文件,任何人都可以看到任何明显的问题吗?这是具有魔力的节点模块代码:

Image.prototype.convert = function(callback) {    
  exec(util.buildCommand(this), {encoding: 'binary', maxBuffer: 10*1024*1024}, callback);
}

(buildCommand 函数只生成“wkhtmltoimage www.google.com -”命令,我已经使用节点检查器验证了它是否正确执行此操作。

更新:如果有人稍后发现并感兴趣,我找到了解决方案。我使用的插件 (node-wkhtml) 无法正确处理大缓冲区,因为选择使用child-process.exec我更改了要使用的插件代码child-process.spawn,并且它按预期工作。

4

0 回答 0