2

I am trying to automate deployment to an AWS server and I am getting the error:

TypeError: node_ssh is not a constructor at Object.

Here is the code in question.

I have installed Node SSH and Node CMD

Node is version 14.16.0

NPM is version 6.14.11 This is for a school project on deployment using starter-node-angular found at the following website:

https://github.com/scotch-io/starter-node-angular

var cmd = require('node-cmd');
var path, node_ssh, ssh, fs;
fs = require('fs');
path = require('path');
node_ssh = require('node-ssh');
ssh = new node_ssh();

// the method that starts the deployment process
function main() {
  console.log('Deployment started.');
  sshConnect();
}

// installs PM2
function installPM2() {
  return ssh.execCommand(
    'sudo npm install pm2 -g', {
      cwd: '/home/ubuntu'
  });
}

// transfers local project to the remote server
function transferProjectToRemote(failed, successful) {
  return ssh.putDirectory(
    '../hackathon-starter',
    '/home/ubuntu/starter-node-angular-temp',
    {
      recursive: true,
      concurrency: 1,
      validate: function(itemPath) {
        const baseName = path.basename(itemPath);
        return (
          baseName.substr(0, 1) !== '.' && baseName !== 'node_modules' // do not allow dot files
        ); // do not allow node_modules
      },
      tick: function(localPath, remotePath, error) {
        if (error) {
          failed.push(localPath);
          console.log('failed.push: ' + localPath);
        } else {
          successful.push(localPath);
          console.log('successful.push: ' + localPath);
        }
      }
    }
  );
}

// creates a temporary folder on the remote server
function createRemoteTempFolder() {
  return ssh.execCommand(
    'rm -rf starter-node-angular-temp && mkdir starter-node-angular-temp', {
      cwd: '/home/ubuntu'
  });
}

// stops mongodb and node services on the remote server
function stopRemoteServices() {
  return ssh.execCommand(
    'pm2 stop all && sudo service mongod stop', {
      cwd: '/home/ubuntu'
  });
}

// updates the project source on the server
function updateRemoteApp() {
  return ssh.execCommand(
    'mkdir starter-node-angular && cp -r starter-node-angular-temp/* starter-node-angular/ && rm -rf starter-node-angular-temp', {
      cwd: '/home/ubuntu'
  });
}

// restart mongodb and node services on the remote server
function restartRemoteServices() {
  return ssh.execCommand(
    'cd starter-node-angular && sudo service mongod start && pm2 start app.js', {
      cwd: '/home/ubuntu'
  });
}

// connect to the remote server
function sshConnect() {
  console.log('Connecting to the server...');

  ssh
    .connect({
      // TODO: ADD YOUR IP ADDRESS BELOW (e.g. '12.34.5.67')
      host: '3.93.193.167',
      username: 'ubuntu',
      privateKey: 'FinalDeployment.pem'
    })
    .then(function() {
      console.log('SSH Connection established.');
      console.log('Installing PM2...');
      return installPM2();
    })
    .then(function() {
      console.log('Creating `starter-node-angular-temp` folder.');
      return createRemoteTempFolder();
    })
    .then(function(result) {
      const failed = [];
      const successful = [];
      if (result.stdout) {
        console.log('STDOUT: ' + result.stdout);
      }
      if (result.stderr) {
        console.log('STDERR: ' + result.stderr);
        return Promise.reject(result.stderr);
      }
      console.log('Transferring files to remote server...');
      return transferProjectToRemote(failed, successful);
    })
    .then(function(status) {
      if (status) {
        console.log('Stopping remote services.');
        return stopRemoteServices();
      } else {
        return Promise.reject(failed.join(', '));
      }
    })
    .then(function(status) {
      if (status) {
        console.log('Updating remote app.');
        return updateRemoteApp();
      } else {
        return Promise.reject(failed.join(', '));
      }
    })
    .then(function(status) {
      if (status) {
        console.log('Restarting remote services...');
        return restartRemoteServices();
      } else {
        return Promise.reject(failed.join(', '));
      }
    })
    .then(function() {
      console.log('DEPLOYMENT COMPLETE!');
      process.exit(0);
    })
    .catch(e => {
      console.error(e);
      process.exit(1);
    });
}

main();

VasilyWRS
  • 21
  • 4

1 Answers1

4

Importing and building the node ssh client at the top of your file should look like this:

const {NodeSSH} = require('node-ssh')
ssh = new NodeSSH()
JD D
  • 7,398
  • 2
  • 34
  • 53
  • It worked, but I had to remove the const from ssh to make it work properly – VasilyWRS May 23 '21 at 21:14
  • You need to declare the ssh variable in one row : const ssh = new NodeSSH(); cause const variables cant be redeclared see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const – Feiga Lubow Nov 24 '22 at 13:42