Search code examples
node.jsssh2ssh2-sftp-client

Node.js ssh2-sftp-client Error: fastPut: No response from server Local


I am using node -v v14.17.0 and "ssh2-sftp-client": "^7.0.0" and method fastPut https://github.com/theophilusx/ssh2-sftp-client#sec-5-2-9

Checking the remote files is okay, so connection works.

My environment is wsl2 Ubuntu-20.04

Problem I face is error

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)

I have tried also with sftp> put /home/draganddrop/testi.txt Downloads/testi.txt from console, which works.

Code I am using:

        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);
        });

I have no idea what causes this error, I've tried with different paths and get either bad path error or this. What could be the cause?


Solution

  • The reason for the problem is that the connection is closing before the finish of executing fastPut.
    You are running connect, after that in the first .then, the method fastPut runs asynchronously, it doesn't wait for the finish execution and return undefined to the next method .then of the chain.
    To solve the problem you just need to return a promise received from fastPut

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