无法在nodejs函数中返回值

时间:2017-09-15 09:32:42

标签: node.js callback

我无法从nodejs函数获取返回值以发布请求。我需要"回复"来自generateHash并希望存储在" hashVal"在上面的帖子请求中

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

4 个答案:

答案 0 :(得分:1)

generateHash是一个异步函数。你不能这样返回结果。你必须在回调中返回它

NVL

答案 1 :(得分:0)

generateHash功能添加回调并在end事件中调用它:

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

控制器:

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

另一种现代方式是使用承诺:

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

控制器:

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

答案 2 :(得分:0)

由于它的异步特性,你无法在Node.js中返回这种方式。 你可以做的一件事就是使用回调

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <div id="inputform">
    <form id="form" >
      <label><b>Address:</b></label><input type="text" id="address" name="address" required>
      <input type="submit" value="Submit" id="submit" >
    </form>
  </div>
    <div id="map"></div>
<script src="https://code.jquery.com/jquery-3.1.0.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCv7cEqzgOMNus_dXIMf98XvWBFtY5-W4o" async defer></script>
</body>
</html>

答案 3 :(得分:0)

查看代码,您在名为generateHash的变量中定义了函数,而不是filehash对象中的属性。

尝试更换:

var hashVal = generateHash(filePath);

Test-ModuleManifest