TypeError: Cannot set property closed of #<Readable> which has only a getter sftp报错
时间: 2025-07-14 14:41:59 浏览: 2
<think>好的,我现在需要帮助用户解决在Node.js中使用SSH2库时遇到的TypeError错误,具体是“无法设置Readable对象的closed属性”。首先,我应该先了解这个错误发生的背景。用户提到他们使用的是SFTP,可能是在处理文件传输时出现了问题。错误信息指出尝试设置一个只有getter的属性closed,这意味着closed属性是只读的,不能直接赋值。
接下来,我需要回忆一下Node.js中Stream对象的相关知识。Readable流通常有closed属性,可能是由底层库管理的,用户不能直接修改。在SSH2库中,SFTP会话可能会创建Readable流来处理文件传输,如果用户尝试手动关闭这个流,可能会触发这个错误。
然后,我应该检查用户提供的代码示例,但用户并没有给出具体的代码。不过根据常见的SSH2使用模式,用户可能在某个地方调用了类似`stream.closed = true`的操作,或者尝试调用了一个不存在的方法,比如`close()`。需要确认SSH2库的文档,看看正确的关闭流的方法是什么。
根据引用[1]和引用[2],之前的类似错误都是因为调用了未定义的方法或属性。例如,`setDisabled`和`close`方法不存在于某个对象上。因此,这里的问题可能也是用户错误地调用了`closed`属性,而该属性在Readable流中是只读的。
接下来,我需要找出正确的关闭SFTP流的方法。查阅SSH2库的文档,正确的做法应该是调用`close()`方法,或者让流自动关闭。此外,确保在错误处理中正确销毁流,并释放资源。
可能的解决方案包括:避免手动设置closed属性,使用正确的API来关闭流,检查流的状态后再进行操作,以及确保在回调或Promise中正确处理流的生命周期。同时,更新SSH2库到最新版本可能修复已知的问题。
最后,生成相关问题需要考虑用户可能的后续疑问,比如如何正确关闭SFTP连接,如何调试这类TypeError,以及SSH2库的其他常见问题。</think>### 解决SFTP中TypeError: 无法设置Readable对象的closed属性问题
该错误表明您尝试修改Node.js中$Readable$流的只读属性$closed$。在SSH2库的SFTP操作中,文件流(如通过`createReadStream`生成的流)的$closed$属性由库自动管理,开发者不能直接修改[^1][^2]。
#### 错误原因分析
1. **属性权限冲突**
$Readable.closed$属性在Node.js流中为只读属性,仅用于查询流状态,直接赋值会触发TypeError
2. **错误操作示例**
```javascript
// 错误示例:尝试手动关闭流
const stream = sftp.createReadStream(remotePath);
stream.closed = true; // 触发TypeError
```
#### 解决方案
1. **使用标准API关闭流**
通过调用$destroy()$方法或等待自动关闭:
```javascript
// 正确关闭方式
stream.destroy(); // 强制关闭流
// 或等待流自然结束
stream.on('end', () => console.log('流已自动关闭'));
```
2. **检查流状态**
操作前验证流是否可写:
```javascript
if (!stream.destroyed) {
// 执行安全操作
}
```
3. **更新SSH2库**
使用npm升级到最新版本:
```bash
npm update ssh2
```
#### 完整示例代码
```javascript
const { Client } = require('ssh2');
const conn = new Client();
conn.on('ready', () => {
conn.sftp((err, sftp) => {
if (err) throw err;
const stream = sftp.createReadStream('/remote/file.txt');
stream.on('data', (chunk) => {
console.log(chunk.toString());
});
stream.on('end', () => {
console.log('传输完成');
conn.end(); // 正确关闭连接
});
// 错误处理
stream.on('error', (err) => {
console.error('流错误:', err);
stream.destroy(); // 异常时销毁流
});
});
}).connect(sshConfig);
```
阅读全文
相关推荐


















