我有一个节点服务,它从API获取pdf并提供该pdf。
当我卷曲或直接打开API时,我确实看到了正确的pdf。
但是当我从我的Node应用程序提供它时,我得到一个空的pdf。
这是我执行pdf渲染的代码部分。
} else if (options.type === 'pdf') {
res.writeHead(200, {'content-type' : 'application/pdf', 'content-disposition': 'attachment; filename=invoice.pdf'});
res.end(data.invoice);
我已经调试了data.log'ed data.invoice以了解它是正确的东西。
typeof(data.invoice)给出字符串;但我也尝试了res.end(new Buffer(data.invoice));这也没用。
以下是我获取数据的代码部分
var http_options = {
method : options.method
, host : Config.API.host
, path : options.path
, port : Config.API.port
, headers : options.headers
};
var req = http.request(http_options, function (response) {
var raw_response = "";
response.on('data', function (response_data) {
raw_response += response_data.toString();
});
response.on('end', function () {
if (response.statusCode !== 200) {
cb(raw_response);
} else {
cb(false, raw_response);
}
});
});
req.setTimeout(timeout, function () {
req.abort();
cb("API connection timed out");
});
req.on('error', function (error) {
cb("API error while requesting for " + options.path + '\n' + error + '\n' + "http options: " + JSON.stringify(http_options)
});
req.end();
答案 0 :(得分:2)
当您收到PDF时toString()
和连接很可能会破坏它。尝试将raw_response
写入文件(您可以使用writeFileSync()
,因为这只是一次性测试)并与使用curl检索的相同PDF进行逐字节比较。
请注意,如果字符串转换过程已损坏它,尝试在发送之前将其转换回缓冲区将无济于事。你必须从头到尾保持整个事物的缓冲。
答案 1 :(得分:1)
由于您不打算在传输过程中修改或读取此数据,因此我建议您使用pipe函数将所有来自response
的数据传输到req
。 this question has a good sample,但这是一段摘录。
req.on('response', function (proxy_response) {
proxy_response.pipe(response);
response.writeHead(proxy_response.statusCode, proxy_response.headers);
});
请注意,没有理由将来自Buffers的响应中的块转换为其他内容,只需将它们作为未修改的缓冲区写入,然后流式传输它们(这就是管道将为您做的事情)而不是累积它们来获取最高效率(和node.js流时髦点)。