You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js ssh2-sftp-client调用get方法指定编码报错如何解决

错误原因

你遇到的报错核心是参数传参位置和类型完全不符合2.1.1版本ssh2-sftp-client的实际实现逻辑:

  • 你之前不传额外参数能正常运行,是因为该版本sftp.get的第二个位置参数是预留的「本地文件写入路径/可写流」参数,留空为undefined时,源码会自动跳过本地写入逻辑,直接返回内存中的文件Buffer内容。
  • 文档里标注的[useCompression]/[encoding]这类可选配置,在2.x版本中不是独立按顺序传入的位置参数,而是统一放在options配置对象里传递。
  • 你在第二个参数位置传入数组、布尔值时,源码会把传入值误判为可写流实例,尝试调用其.once()事件监听方法,自然会抛出wtr.once is not a function的类型错误。
  • 方法签名里的方括号仅用于标注参数可选,不代表这些配置项要拆成独立参数按位置传入,也不需要用数组包裹参数。
正确写法

如果你不需要将远程文件直接写入本地磁盘,只想在内存中拿到指定编码的文件内容,需要用null对第二个位置的dst参数做占位,再传入包含编码配置的options对象:

const Client = require('ssh2-sftp-client');
const sftp = new Client();

const config = {
  host: urls,
  port: port,
  user: user,
  password: password,
};

sftp.connect(config)
  .then(() => {
    // 第二个位置传null占位,第三个参数传配置对象指定编码
    return sftp.get(file, null, {
      encoding: 'iso-8859-1',
      useCompression: false
    });
  })
  .then((response) => {
    // 这里拿到的response就是指定编码解析后的文件内容
    // 写入你的业务逻辑即可
    console.log('文件内容:', response);
    return sftp.end(); // 操作完成后记得关闭SFTP连接
  })
  .catch(err => {
    console.error('SFTP操作出错:', err);
    sftp.end();
  });
补充说明
  • 如果你后续升级到7.x以上的新版ssh2-sftp-client,get方法的参数逻辑有调整,不需要手动做null占位,直接传(remotePath, {encoding, useCompression})即可,但2.1.1版本必须按上述占位方式传参。
  • 传入encoding配置后,方法返回的结果不再是原始Buffer,而是对应编码解析后的字符串,不需要再手动做编码转换。

内容的提问来源于stack exchange,提问作者Nimrod Yanai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:48:53