2017-09-15 127 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);