rajasekhar pippalla
rajasekhar pippalla

Reputation: 195

Unable to return value in nodejs function

I am unable to get return value from nodejs function to post request. I need "response" from generateHash and want to store in "hashVal" in the above post request

app.post('/filehash', function(req, res) {
    var filePath = req.body.filePath;
    if (!filePath) {
        res.json(getErrorMessage('\'filePath\''));
        return;
    }
    var hashVal = fileHash.generateHash(filePath); 
        logger.info('hashVal---->>>> '+hashVal);
    res.send(hashVal);
});


var generateHash = function(filePath) {
 var algo = 'md5';
  var shasum = crypto.createHash(algo);
  var response = '';
  var s = fs.ReadStream(filePath);
  s.on('data', function(d) { shasum.update(d); });
  s.on('end', function() {
    var d = shasum.digest('hex');
    logger.debug('\n====== Creating filehash \'' + d + '\' ======\n');
    console.log(d);
    response=d;
    return response;
  });
};

Upvotes: 1

Views: 493

Answers (4)

alexmac
alexmac

Reputation: 19587

Add callback to generateHash function and call it in on end event:

var generateHash = function(filePath, cb) {
  ...
  s.on('error', function(err) {
    cb(err);
  });
  s.on('end', function() {
    ...
    cb(null, response);
  });
});

Controller:

app.post('/filehash', function(req, res) {
  ...
  fileHash.generateHash(filePath, (err, hashVal) => {
    if (err) {
      return res.status(500).send(err);
    }
    logger.info('hashVal---->>>> '+ hashVal);
    res.send(hashVal);
  }); 
});

Another, modern way is to use promises:

var generateHash = function(filePath, cb) {
  ...
  return new Promise((resolve, reject) => {
    s.on('error', function(err) {
      reject(err);
    });
    s.on('end', function() {
      ...
      resolve(response);
    });
  });
});

Controller:

app.post('/filehash', function(req, res) {
  ...
  fileHash
   .generateHash(filePath)
   .then(hashVal => {
      logger.info('hashVal---->>>> '+hashVal);
      res.send(hashVal);
    })
    .catch(err => res.status(500).send(err); 
});

Upvotes: 0

duhecx
duhecx

Reputation: 31

Looking at your code, you defined your function in a variable named generateHash not as an attribute inside filehash object.

Try replacing:

var hashVal = fileHash.generateHash(filePath);

with

var hashVal = generateHash(filePath);

Upvotes: 0

Daphoque
Daphoque

Reputation: 4678

generateHash is an async function. You can't return result like this. You have to return it in a callback

app.post('/filehash', function(req, res) {
    var filePath = req.body.filePath;
    if (!filePath) {
        res.json(getErrorMessage('\'filePath\''));
        return;
    }
    fileHash.generateHash(filePath, function(hashVal){ 
        logger.info('hashVal---->>>> '+hashVal);
        res.send(hashVal);
    });

   });


var generateHash = function(filePath, cb) {
   var algo = 'md5';
   var shasum = crypto.createHash(algo);
   var response = '';
   var s = fs.ReadStream(filePath);
   s.on('data', function(d) { shasum.update(d); });
   s.on('end', function() {
    var d = shasum.digest('hex');
    logger.debug('\n====== Creating filehash \'' + d + '\' ======\n');
    console.log(d);
    response=d;
    return cb(response);
  });
};

Upvotes: 1

abdulbari
abdulbari

Reputation: 6232

You can't return such way in Node.js due to async nature of it. One thing you can do here use callback

app.post('/filehash', function(req, res) {
    var filePath = req.body.filePath;
    if (!filePath) {
        res.json(getErrorMessage('\'filePath\''));
        return;
    }
    fileHash.generateHash(filePath,function(err,hashVal){
        logger.info('hashVal---->>>> '+hashVal);
        res.send(hashVal);
    }); 
});


var generateHash = function(filePath,callback) {
 var algo = 'md5';
  var shasum = crypto.createHash(algo);
  var response = '';
  var s = fs.ReadStream(filePath);
  s.on('data', function(d) { shasum.update(d); });
  s.on('end', function() {
    var d = shasum.digest('hex');
    logger.debug('\n====== Creating filehash \'' + d + '\' ======\n');
    console.log(d);
    response=d;
    callback(null,response);
  });
};

Upvotes: 0

Related Questions