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
相关产品推荐
相关产品推荐

