我正在尝试创建一个节点服务器,该服务器提供使用 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
,并且它按预期工作。