gpt4 book ai didi

node.js - Node 请求写入文件损坏

转载 作者:太空宇宙 更新时间:2023-11-04 02:50:26 27 4
gpt4 key购买 nike

我在 Node 中有一个 get 请求,成功从 API 接收数据。

当我将该响应直接传送到这样的文件时,它可以工作,创建的文件是一个有效的、可读的 pdf(正如我期望从 API 接收的那样)。

var http = require('request');
var fs = require('fs');

http.get(
{
url:'',
headers:{}
})
.pipe(fs.createWriteStream('./report.pdf'));

很简单,但是如果我像这样使用请求的事件发射器,文件就会损坏

  http.get(
{
url:'',
headers:{}
})
.on('error', function (err) {
console.log(err);
})
.on('data', function(data) {
file += data;
})
.on('end', function() {
var stream = fs.createWriteStream('./report.pdf');
stream.write(file, function() {
stream.end();
});
});

我尝试了各种编写此文件的方式,但它总是以完全空白的 pdf 结尾 - pdf 唯一有效的时间是通过管道方法。

当我通过控制台记录事件时,顺序似乎是正确的 - 即,接收到所有 block ,然后 end 在最后触发。

这使得在管道之后无法做任何事情。 Pipe 与 writestream 的作用有何不同?

最佳答案

我假设您将file初始化为字符串:

var file = '';

然后,在您的 data 处理程序中,向其中添加新的数据 block :

file += data;

但是,这会执行到(UTF-8 编码)字符串的隐式转换。如果数据实际上是二进制的,例如 PDF,这将使输出数据无效。

相反,您希望收集 data block (即 Buffer 实例),并使用 Buffer.concat()将所有这些缓冲区连接成一个大(二进制)缓冲区:

var file = [];
...
.on('data', function(data) {
file.push(data);
})
.on('end', function() {
file = Buffer.concat(file);
...
});

关于node.js - Node 请求写入文件损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45157605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com