数据事件的可读流从块中丢失第一个/最后一个字符

时间:2017-10-11 11:19:56

标签: node.js stream readable

我使用ssh2-sftp-client为nodeJS连接到sftp服务器并获取文件 但是我遇到了一个问题,当比一个块更多时,数据没有被正确接收,它在块之间丢失了一个字符:
例如:sftp上的文件有'sftp文件中的一些字符串' 如果它以块的形式分割,接收的数据将如下:
第一块:'某些字符串f'
第二个缺口:'om sftp file'
在这个例子中'r'丢失了

const getFile = readable => new Promise((resolve, reject) => {
  let file = '';
   readable.on('data', (chunk) => { file += chunk; }); 
  readable.on('end', () => resolve(file));
  readable.on('error', reject);
});

const readable = await sftp.get(fileName, false);

sftp.get()返回NodeJS.ReadableStream

有人遇到同样的问题吗?

2 个答案:

答案 0 :(得分:0)

更可取的做法是将块存储为数组,然后将它们连接到缓冲区并在结束时获取字符串值:

const fs = require('fs');

const getFile = readable => new Promise((resolve, reject) => {
  const file = [];
  readable.on('data', chunk => file.push(Buffer.from(chunk, 'base64')));
  readable.on('end', () => resolve(Buffer.concat(file).toString()));
  readable.on('error', reject);
});


const readable = fs.createReadStream('package.json');

getFile(readable).then(file => console.log('file', file));

在本地运行并按预期获取文件内容。

答案 1 :(得分:0)

经过长时间的研究后,我发现问题,在模块sftp-stream中,可读流highWaterMark被设置为64 * 1024,而错误是如果一个块有64 * 1024个咬,那么就会丢失一个咬。我只是将水印设置为64 * 1024-1。