Node.js NodeJS:fs.createReadStream有时不读取所需的;“开始”;及;完";字节

Node.js NodeJS:fs.createReadStream有时不读取所需的;“开始”;及;完";字节,node.js,fs,Node.js,Fs,我目前正在使用fs.createReadStream从文件中读取一定数量的字节 这是我的密码 const readFile = (file, start, end) => { return new Promise((resolve, reject) => { let readStream = fs.createReadStream(file, { start : start, end: start+end }) readStream.on("error"

我目前正在使用
fs.createReadStream
从文件中读取一定数量的字节

这是我的密码

const readFile = (file, start, end) => {
return new Promise((resolve, reject) => {
  let readStream = fs.createReadStream(file, { start : start, end: start+end })

  readStream.on("error", () => {console.log("Error occured on " + file)})
  readStream.on('data', function(d) {
    console.log(start)
    console.log(start+end)
    console.log(d.byteLength)
    resolve(d)
  });
})
}

我将开始设置为0。和结尾作为所需字节(例如:5000)

此函数在循环中运行(假设此函数运行10次)

这是输出(我记录了我得到的尺寸)

注意那些只阅读少于5000的人

只有当我在一个超过10次的循环中多次运行这个时,才会发生这种情况

这里有什么问题

编辑:如您所见,参数都是相同的。甚至这些文件都是原始文件的多个副本

编辑2.0: 这解决了我的问题!为了获得所需的数据,我初始化了一个缓冲区并连接了
.on('data')
中的块,最后在
.on('end')
上解析

以下是更新后的函数:

const readFile = (file, start, end) => {
return new Promise((resolve, reject) => {
  let data = Buffer.alloc(0)
  let readStream = fs.createReadStream(file, { start : start, end: start+end })
  readStream.on("error", () => {console.log("Error occured on " + file)})
  readStream.on('data', function(d) {
    data = Buffer.concat([data, d])
  });
  readStream.on("end", function(d) {
    console.log(file)
    console.log(start)
    console.log(start+end)
    console.log(data.byteLength)
    resolve(data)
  })
})
}
非常感谢tawfik nasser

您正在使用ReadStream。 因此,
.on('data')
返回数据的
chunk

此外,您正在解析第一个数据块

您应该在('end')上解析
,而不是在每次获取数据块时解析。

您使用的是ReadStream。 因此,
.on('data')
返回数据的
chunk

此外,您正在解析第一个数据块


您应该在('end')
上解析
,而不是在每次获取数据块时解析。

添加有关调用函数的更多信息将很有帮助。您已经提到它在循环中被调用了10次。循环是异步的还是所有调用的参数都相同?参数都相同。该函数在返回承诺的.map内调用。然后我在使用Promise.all()后处理它们。我现在想知道为什么与其他调用相比,它只返回几个字节?添加一些关于调用函数的更多信息会很有帮助。您已经提到它在循环中被调用了10次。循环是异步的还是所有调用的参数都相同?参数都相同。该函数在返回承诺的.map内调用。然后我在使用Promise.all()后处理它们。我现在想知道为什么与其他调用相比,它只返回几个字节?谢谢!!成功了!现在我了解了Readstream的工作原理。起初我认为('data')
上的
.on给出了整个数据。因此它只是一块数据。接受了你的回答!还编辑了我如何使其工作的问题。谢谢!!使其工作!现在我了解了Readstream的工作原理。起初我认为
.on('data'
给出了全部数据。所以它只是一块数据。接受了你的答案!还编辑了我如何让它工作的问题。
const readFile = (file, start, end) => {
return new Promise((resolve, reject) => {
  let data = Buffer.alloc(0)
  let readStream = fs.createReadStream(file, { start : start, end: start+end })
  readStream.on("error", () => {console.log("Error occured on " + file)})
  readStream.on('data', function(d) {
    data = Buffer.concat([data, d])
  });
  readStream.on("end", function(d) {
    console.log(file)
    console.log(start)
    console.log(start+end)
    console.log(data.byteLength)
    resolve(data)
  })
})
}