我无法从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;
});
};
答案 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