【发布时间】:2020-12-18 00:38:54
【问题描述】:
有一个带有方法 GET 的 API。
https://api.download.com/getxxxxxxx/id
响应不是 JSON 格式。它是一个 PDF(内容类型:application/pdf)。 响应头
Date: Fri, 28 Aug 2020 16:45:35 GMT
Server: Apache/2.4.18 (Ubuntu)
X-Content-Type-Options: nosniff
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
X-Content-Type-Options: nosniff
Vary: Accept
Content-Length: 955006
Content-Type: application/pdf
我试过这种方法
const assessmentDetails = {
method: 'get',
url: 'https://api.download.com/getxxxxxxx/id',
json: false,
headers: {
'api-key': ApiKey.assessmentApikey
}
};
const file_name = uuid + "_summary_report.pdf"
const file = fs.createWriteStream("./reports/" + file_name);
http.get(assessmentDetails, function (res) {
file.on('open', function () {
file.pipe(res);
console.log.info('download completed: ' + file);
});
file.on('error', function (err) {
console.log.error('' + err);
});
});
但它没有写入 pdf 文件。我可以看到一个损坏的文件。请向我建议,如何解决这个问题。如何将PDF文件保存为节点js中API的响应?
编辑:
根据@eol 的回答尝试了以下方法。文件正在下载,但出现 HTTP 解析错误。
const file_name = uuid + "_summary_report.pdf"
const file = fs.createWriteStream("./reports/" + file_name);
try {
https.get(url, assessmentDetails, function (res) {
res.pipe(file);
}).on('response', function (data) {
res.json({
statuscode: 200,
message: 'File downloaded successfully',
});
})
}
catch (error) {
res.json({
statuscode: 500,
message: 'Something went wrong',
error: error
});
}
控制台出错
"level":"error","message":"uncaughtException: Parse Error: Expected HTTP/\nError: Parse Error: Expected HTTP/\n at TLSSocket.socketOnData (_http_client.js:469:22)\n at TLSSocket.emit (events.js:315:20)\n at TLSSocket.EventEmitter.emit (domain.js:483:12)\n at addChunk (_stream_readable.js:295:12)\n at readableAddChunk (_stream_readable.js:271:9)\n at TLSSocket.Readable.push (_stream_readable.js:212:10)\n at TLSWrap.onStreamRead (internal/stream_base_commons.js:186:23)","stack":"Error: Parse Error: Expected HTTP/\n at TLSSocket.socketOnData (_http_client.js:469:22)\n at TLSSocket.emit (events.js:315:20)\n at TLSSocket.EventEmitter.emit (domain.js:483:12)\n at addChunk (_stream_readable.js:295:12)\n at readableAddChunk (_stream_readable.js:271:9)\n at TLSSocket.Readable.push (_stream_readable.js:212:10)\n at TLSWrap.onStreamRead (internal/stream_base_commons.js:186:23)",
【问题讨论】:
标签: node.js express http request fs