larrybg
larrybg

Reputation: 510

Nodejs Promise "res.end is not a function" error

I'm refactoring my code to remove a "callback hell" using Promises, but encountered an error that I cannot pass. My code receives list of IDs and processes them making few database calls, that is why I had this "callback hell". Everything worked fine until Promises. The res is equal 0 when I had to respond back to the client.

  function processVMDelete(returnedVMIDs){
    return new Promise((resolve, reject) => {

        var mariasqlClient = dbConnection();
        mariasqlClient.query( sqlUpdateDELETE_STATE_ByVMID, [ 
          'DELETE', 
          returnedVMIDs
        ], function(err, rows) {
          if (err){
            reject(err);
          }
          console.log('finish update');
// dont' need to return anything here
          resolve(0);
        });
        mariasqlClient.end();
    });
  }

  function getListExpVM(){
    return new Promise((resolve, reject) => {

      var vmList = [];
      var mariasqlClient = dbConnection();
      mariasqlClient.query( sqlSearch_ByUSERNAMEAndSTATE, [ 
        requesterUsername, 
        'ACTIVE'
      ], function(err, rows) {
        if (err){
          reject(err);
        }
          vmList = filterExpiredVMs(rows);

          var response = {
            status : 200,
            success : 'Successfull',
            data : vmList,
            requester: requesterUsername
          };
          resolve(response);
      }); 
      mariasqlClient.end();
    });
  }



router.post('/processVMs', function(req, res) {
    var returnedVMIDs = JSON.parse(req.body.data);

    processVMDelete(returnedVMIDs)
      .then(res => {
        console.log('done');

        // check if there is more available for the user:
        getListExpVM()
          .then(response => {
            console.log('sending back list of VMs');

//===>>> ERROR HERE: res.end is not a function
            res.end(JSON.stringify(response));

          })
          .catch(err => {
            console.log('error', err.message);
            logger.error("Error getting expired VMs: " + err.message);

//===>>> ERROR HERE: res.send is not a function
            res.status(500).send({error: err.message})
          });
      })
      .catch(err => {
        console.log('error', err.message);
        logger.error("Error processing VMs: " + err.message);
//===>>> ERROR HERE: res.send is not a function
        res.status(500).send({error: err.message})
      });
});

Upvotes: 2

Views: 4233

Answers (1)

jfriend00
jfriend00

Reputation: 707298

You've redefined res with this:

processVMDelete(returnedVMIDs)
  .then(res => {...})

This will hide the higher scoped res associated with the overall request (the one you need to use for res.end()). Change the name of this one to something else like result and then change the corresponding references that use this result.

Upvotes: 1

Related Questions