2017-09-15 154 views
1

我无法从nodejs函数获取返回值以发布请求。我需要generateHash“响应”,并希望在“hashVal”存储在上述职位要求无法在nodejs函数中返回值

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

回答

1

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

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

可以在Node.js的,由于它的异步性质不返回这样的方式。 有一件事你可以在这里做使用回拨

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

看你的代码返回它,你在一个名为generateHash不是filehash对象内部的属性变量定义的函数。

尝试更换:

var hashVal = fileHash.generateHash(filePath); 

var hashVal = generateHash(filePath);