我需要找到一种方法,在我的主代码块中返回一个字符串以进行摘要,以及一旦返回digest的值,就会在我的主代码块中开始处理代码中的其余代码。
请帮助!
这是我当前的代码不起作用。
var digest = checkIntegrity(filePath, res[3]);
//digest always come back undefined and never matches res[2] so file always deletes
if (digest === 0){
console.log('File Inaccessible');
} else {
if (digest === res[2]){
createNewFile();
} else {
console.log('File hash doesn't match');
delBadFile();
}
}
function checkIntegrity(filePath, algorithm, cb){
console.log('in checkIntegrity');
var hash = crypto.createHash(algorithm);
var digest;
//see if file is there
fs.stat(filePath, function(fileErr, fileStats){
if(fileErr){
//error accessing file, most likely file does not exist
return 0;
} else {
//file exists
var fileIn = fs.createReadStream(filePath);
fileIn.on('data', function(chunk){
if (chunk) {
hash.update(chunk);
}
});
fileIn.on('end', function(){
return hash.digest('hex');
});
}
});
}
答案 0 :(得分:2)
你checkIntegrity
函数是异步的,即它接受回调。您希望作为该函数的结果传递的任何值都应作为参数传递给该回调函数。您的示例中发生的事情是checkIntegrity
正在调用fs.stat
(这也是异步的),然后直接返回undefined
- 在fs.stat
有机会完成之前。< / p>
您可以选择:
fs.stat
更改为fs.statSync
。这是stat函数的同步版本。更改代码以正确使用回调:
checkIntegrity(filePath, res[3], function (err, digest) {
if (err) return console.error(err);
if (digest === 0) {
console.log('File Inaccessible');
} else {
if (digest === res[2]){
createNewFile();
} else {
console.log('File hash doesn\'t match');
delBadFile();
}
}
});
function checkIntegrity(filePath, algorithm, cb){
console.log('in checkIntegrity');
var hash = crypto.createHash(algorithm);
var digest;
//see if file is there
fs.stat(filePath, function(fileErr, fileStats) {
if(fileErr){
//error accessing file, most likely file does not exist
return cb(fileErr);
} else {
//file exists
var fileIn = fs.createReadStream(filePath);
fileIn.on('data', function(chunk){
if (chunk) {
hash.update(chunk);
}
});
fileIn.on('end', function() {
cb(null, hash.digest('hes'));
});
}
});
}
在我看来,异步代码和回调是Node.js的一个基本部分。我鼓励你选择2。这绝对值得学习。有数百个网站,如callbackhell.com,可以更好地解释回调。