【问题标题】:ssh2-sftp-client get multiple files - error "write after end"ssh2-sftp-client 获取多个文件 - 错误“结束后写入”
【发布时间】:2019-06-20 20:14:50
【问题描述】:

我正在尝试从 ftp 加载多个文件,但出现错误:“结束后写入”。我找不到问题。

connections.js

async function getFtpFileContent(_path) {
  const ftpConfig = {
    host: config.FTPhost.replace('https://', ''),
    username: config.FTPusername,
    password: config.FTPpassword
  };
  let ftpFileContent;
  let sftp = new StfpClient();
  try {
    await sftp.connect(ftpConfig);
    const stream = await sftp.get(_path);
    ftpFileContent = await readStream(sftp, stream);
    stream.close();
    await sftp.end();
  } catch (error) {
    console.log('FTP Error: \n', error);
  }

  return ftpFileContent;
}


function readStream(sftp, stream) {
  return new Promise((resolve, reject) => {
    let body;
    stream.on('data', chunk => {
      body += chunk;
    });
    stream.on('end', () => {
      resolve(body);
    });
    stream.on('error', err => reject(err));
  });
}

调用下一个方法:

async function getFiles(req, res) {
  // first file
  let fileContent = await conn.getFtpFileContent(filePath);

  // second file
  let fileContent2 = await conn.getFtpFileContent(filePath2);
}

当我第二次调用 getFtpFileContent 方法时,我得到了上述错误(“结束后写入”)。

你能帮帮我吗?我在哪里做错了?

【问题讨论】:

    标签: javascript ssh2


    【解决方案1】:

    我不确定您的问题出在哪里,但您应该在 getFtpFileContent 函数中调用 stream.close() 吗?我没有看到有关流的关闭方法的任何信息,只有关闭事件。

    【讨论】:

    • 我不确定我是否理解正确......这个const stream = await sftp.get(_path);返回ReadableStream。我应该如何关闭它?我试过stream.destory()stream.close() 还是一样的结果。
    • 我不确定您是否需要关闭它。也许这就是导致您看到的错误的原因。
    【解决方案2】:

    我发现了问题。问题出在我后来使用的 CSV 转换器中。转换器使用了可写流,转换后没有关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 2020-06-28
      • 2018-09-23
      相关资源
      最近更新 更多