eemilk
eemilk

Reputation: 1628

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?

Upvotes: 5

Views: 11419

Answers (2)

Shim-Sao
Shim-Sao

Reputation: 2126

You can also use async/await:

I use it for looping on a repository, I don't want to return an array of results but wait for each files.

sftp.connect(config)
  // async and wait before continue
  .then(async () => {
    await sftp.fastPut(localPath, remotePath, options)
    /* do something, don't care of the result value (blah blah was copied ...) */
  })

  // No data or useless then if nothing to do
  .then(() => {/* do something*/})

  // Close the connection
  .finally(() => sftp.end());

Upvotes: 0

Pavlo Naumenko
Pavlo Naumenko

Reputation: 732

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())

Upvotes: 7

Related Questions