【问题标题】:readable stream on data event losing first/last character from chunk数据事件的可读流从块中丢失第一个/最后一个字符
【发布时间】:2018-03-23 01:16:06
【问题描述】:

我正在使用 nodeJS 的 ssh2-sftp-client 连接到 sftp 服务器并获取文件 但是我遇到了一个问题,当块多于一个时,数据没有正确接收,块之间会丢失一个字符:
例如:sftp 上的文件具有“来自 sftp 文件的某些字符串”
如果它被分成块,接收到的数据将是这样的:
第一个块:'一些字符串 f'
第二个裂缝:“om sftp 文件”
在这个例子中,'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

有人遇到同样的问题吗?

【问题讨论】:

    标签: node.js stream readable


    【解决方案1】:

    将块存储为数组然后将它们连接到缓冲区并获取字符串值是否更可取:

    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));
    

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

    【讨论】:

    • 我遇到了这个错误 TypeError: "list" argument must be an Array of Buffer or Uint8Array instances
    • 问题不在于语法
    • 你运行的是哪个版本的节点,因为它应该可以工作我在 8.6.0 上本地测试过
    • 我正在使用节点:'8.5.0'
    • 不幸的是它并没有解决丢失字符的问题
    【解决方案2】:

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

    【讨论】:

    • 我也面临同样的问题。更改水印并不能解决 sftp 的问题。
    猜你喜欢
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多