我正在编写一个Node Express服务器,该服务器通过sftp连接到文件存储。我正在使用ssh2-sftp-client软件包。
要检索文件,它具有一个带有以下签名的get
函数:
get(srcPath, dst, options)
dst
参数应该是字符串或a writable stream, which will be used as the destination for a stream pipe
。
我要避免在服务器上创建文件对象,而是按照本article所述将文件传输到客户端上以节省内存。我尝试使用以下代码完成此任务:
const get = (writeStream) => {
sftp.connect(config).then(() => {
return sftp.get('path/to/file.zip', writeStream)
});
};
app.get('/thefile', (req, res) => {
get(res); // pass the res writable stream to sftp.get
});
但是,这导致我的节点服务器由于未处理的承诺拒绝而崩溃。我尝试的可能吗?在发送给客户端之前,我应该先将文件存储在服务器上吗?我已经查看了有关sftp软件包的文档/示例,但是找不到我想要的示例。
答案 0 :(得分:0)
我发现了错误,这对我来说是一个愚蠢的错误。我忘记了结束sftp
连接。再次调用此方法时,尝试再次连接时将引发异常。如果有人发现自己处于相同的情况,请记住在完成连接后结束连接,如下所示:
const get = (writeStream) => {
sftp.connect(config).then(() => {
return sftp.get('path/to/file.zip', writeStream);
}).then(response => {
sftp.end();
resolve(response);
});
};