Node.js ssh2-sftp-client 错误:fastPut:服务器本地没有响应

Posted

技术标签:

【中文标题】Node.js ssh2-sftp-client 错误:fastPut:服务器本地没有响应【英文标题】:Node.js ssh2-sftp-client Error: fastPut: No response from server Local 【发布时间】:2021-09-26 06:56:24 【问题描述】:

我正在使用node -v v14.17.0"ssh2-sftp-client": "^7.0.0" 以及方法fastPut https://github.com/theophilusx/ssh2-sftp-client#sec-5-2-9

检查远程文件没问题,所以连接正常。

我的环境是wsl2 Ubuntu-20.04

我面临的问题是错误

RuntimeError: abort(Error: fastPut: No response from server Local: /home/draganddrop/testi.txt Remote: Downloads/testi.txt). Build with -s ASSERTIONS=1 for more info.
    at process.J (/home/draganddrop/node_modules/ssh2/lib/protocol/crypto/poly1305.js:20:53)
    at process.emit (events.js:376:20)
    at processPromiseRejections (internal/process/promises.js:245:33)
    at processTicksAndRejections (internal/process/task_queues.js:96:32)

我也尝试使用控制台中的sftp> put /home/draganddrop/testi.txt Downloads/testi.txt,它有效。

我正在使用的代码:

        let Client = require('ssh2-sftp-client');
        let sftp = new Client();
    
        let remotePath = 'Downloads/testi.txt';
        let localPath = '/home/draganddrop/testi.txt'

        const config = 
          host: 'XX.XX.XXX.XXX',
          port: '22',
          username: 'XXXXX',
          password: 'XXXXXX'
        ;

        sftp.connect(config)
        .then(() => 
          sftp.fastPut(localPath, remotePath);
          //return sftp.exists(remotePath);
        )
        //.then(data => 
        //  console.log(data);          // will be false or d, -, l (dir, file or link)
        //)
        .then(() => 
          sftp.end();
        )
        .catch(err => 
          console.error(err.message);
        );

我不知道是什么导致了这个错误,我尝试了不同的路径并得到了错误的路径错误或这个。可能是什么原因?

【问题讨论】:

嗨@eemilk,看起来像异步函数fastPut和第二个then中的问题,它在放置文件之前关闭连接,尝试先返回promise然后return sftp.fastPut(localPath, remotePath); @PavloNaumenko 这似乎成功了。 我在答案中也写了同样的内容 【参考方案1】:

问题的原因是连接在执行完fastPut之前关闭。 你正在运行connect,在第一个.then之后,方法fastPut异步运行,它不等待完成执行并返回未定义到下一个方法.then链。 要解决问题,您只需返回从fastPut 收到的承诺

sftp.connect(config)
        .then(() => sftp.fastPut(localPath, remotePath))
        .then((data) => /* do something*/
        .finally(() => sftp.end())

【讨论】:

第一个'then'应该返回?返回 sftp.fastPut.... 对不起@BertC,我没有得到这个问题。第一个then的回调是箭头函数表达式,所以它返回sftp.fastPut的结果 是的@Pavlo,你是绝对正确的。我错过了丢失的花括号。很抱歉。

以上是关于Node.js ssh2-sftp-client 错误:fastPut:服务器本地没有响应的主要内容,如果未能解决你的问题,请参考以下文章

ssh2-sftp-client get()请求提供“拒绝权限-错误”

Node.js 入门

Node.js 模块

[Node.js]如何在IDEA中配置Node.js

node.js 初识node.js,运行在服务端的 JavaScript

node.js教程基础:node.js命令行选项