首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在fastGet中正确使用ssh2-sftp客户端库的Node.js方法?

如何在fastGet中正确使用ssh2-sftp客户端库的Node.js方法?
EN

Stack Overflow用户
提问于 2019-01-26 16:15:27
回答 1查看 6.3K关注 0票数 2

我正在Node.js应用程序中尝试从远程SFTP服务器加载文件。我使用Ssh2-sftp客户端库来完成这个任务。不幸的是,我有错误。我做错了什么?

当我使用这样的代码时,它会正确地返回远程SFTP服务器路径中所有文件的列表。

代码语言:javascript
复制
router.get('/', (req, res) => {
  sftp.connect(config.sftpServer).then(() => {
    return sftp.list('/reports')
  }).then((data) => {
    console.log(data)
  }).catch((error) => {
    console.log(error)
  })
})

在控制台中,我看到了这样的结果:

代码语言:javascript
复制
[ { type: '-',
    name: '1548244803285.csv',
    size: 74589,
    modifyTime: 1548278757000,
    accessTime: 1548513471000,
    rights: { user: 'rwx', group: 'rwx', other: 'rwx' },
    owner: 1030,
    group: 1022 } ]

如果我尝试使用fastGet方法下载特定文件,则Node.js会引发错误。

代码语言:javascript
复制
return sftp.fastGet('/reports/1548244803285.csv', path.join(process.env.HOME || process.env.USERPROFILE, 'downloads/'))

错误:

代码语言:javascript
复制
Error: Failed to get /reports/NNogerbek1548244803285.csv: EISDIR: illegal operation on a directory, open 'C:\Users\NNogerbek\downloads'
    at C:\Users\NNogerbek\WebstormProject\web-app\node_modules\ssh2-sftp-client\src\index.js:192:16
    at cbfinal (C:\Users\NNogerbek\WebstormProject\web-app\node_modules\ssh2-streams\lib\sftp.js:1038:11)
    at SFTPStream._transform (C:\Users\NNogerbek\WebstormProject\web-app\node_modules\ssh2-streams\lib\sftp.js:389:17)
    at SFTPStream.Transform._read (_stream_transform.js:190:10)
    at SFTPStream._read (C:\Users\NNogerbek\WebstormProject\web-app\node_modules\ssh2-streams\lib\sftp.js:183:15)
    at SFTPStream.Transform._write (_stream_transform.js:178:12)
    at doWrite (_stream_writable.js:410:12)
    at writeOrBuffer (_stream_writable.js:394:5)
    at SFTPStream.Writable.write (_stream_writable.js:294:11)
    at Channel.ondata (_stream_readable.js:666:20)

我用来连接到remore SFTP服务器的用户有读写的权利。不明白问题出在哪里。

最后我找到了问题的原因。EISDIR意味着应用程序试图对一个文件做一些事情,但它是一个目录。

正确的代码是:

代码语言:javascript
复制
return sftp.fastGet('/reports/1548244803285.csv', path.join(process.env.HOME || process.env.USERPROFILE, 'downloads/1548244803285.csv'))

现在我想返回浏览器中的文件作为响应。如何使它正确?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-17 05:32:32

以下是我的最后工作代码:

代码语言:javascript
复制
router.post('/', (req, res) => {
    const fileName = req.body.file_name;

    const remotePath = '/put_your_path_here/' + fileName;

    const localePath = path.join(process.env.HOME || process.env.USERPROFILE, 'Downloads/' + fileName);

    sftp.connect(config.sftpServer, 'once').then(() => {
        sftp.fastGet(remotePath, localePath, {}).then(() => {
            res.header('Content-type', 'text/csv; charset=windows-1251');
            res.sendFile(localePath);
            sftp.end();
        }).catch((err) => {
            sftp.end();
            console.log(err, 'fastGet method error');
        })
    }).catch((err) => {
        sftp.end();
        console.log(err, 'connect method error');
    });
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54380202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档