Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 文件的同步哈希函数_Javascript_Node.js - Fatal编程技术网

Javascript 文件的同步哈希函数

Javascript 文件的同步哈希函数,javascript,node.js,Javascript,Node.js,我有一个函数,它为给定的路径生成校验和 function getHash(path) { var fs = require('fs'); var crypto = require('crypto'); var fd = fs.createReadStream(path); var hash = crypto.createHash('sha1'); hash.setEncoding('hex'); fd.on('end', funct

我有一个函数,它为给定的路径生成校验和

function getHash(path) {
     var fs = require('fs');
     var crypto = require('crypto');

     var fd = fs.createReadStream(path);
     var hash = crypto.createHash('sha1');
     hash.setEncoding('hex');

     fd.on('end', function () {
        hash.end();
        // *** Here is my problem ***
        console.log(hash.read()); 
     });

     fd.pipe(hash);
  };
我想调用
calcnewahsh
函数,以便它返回散列,问题是,我还没有找到此函数的异步版本,也许有人可以提供帮助

只需添加一个
return
语句就行了,因为该函数位于侦听器中


稍后我想将校验和添加到一个对象中,这样我就可以将其作为参数引用,但这仍然不会改变这是一个同步的…

您基本上有两种解决方案:

#1与承诺一起工作(即q-npm安装q-保存) #2或使用回调函数 如果回调函数中没有深度嵌套,我会选择选项2


(注意:幕后承诺也在使用回调,如果你有深度嵌套,这只是一个“更干净”的解决方案)

我知道这很旧,但在搜索这些内容时,它位于顶部结果中。因此,对于那些在这里寻找解决方案的人,你可以这样做:(注意,只有当你知道文件很小时,这才有效。否则,对于较大的文件,请参考Dieterg提供的答案)


非常感谢,我尝试了第二种选择!我没有经常使用回调函数,但现在我想我已经使用了:)因为我试图生成数组的多个散列,并使用循环的变量作为索引,我遇到了一些问题,但我通过将索引作为参数来修复它
function getHash(path) {
     var Q = require('q');
     var fs = require('fs');
     var crypto = require('crypto');

     var deferred = Q.defer();

     var fd = fs.createReadStream(path);
     var hash = crypto.createHash('sha1');
     hash.setEncoding('hex');

     fd.on('end', function () {
        hash.end();
        // *** Here is my problem ***
        console.log(hash.read()); 
        deferred.resolve(hash.read());
     });

     fd.pipe(hash);

     return deferred.promise;
};

getHash('c:\\')
   .then(function(result) {
     // do something with the hash result
   });
function getHash(path, cb) {
     var fs = require('fs');
     var crypto = require('crypto');

     var fd = fs.createReadStream(path);
     var hash = crypto.createHash('sha1');
     hash.setEncoding('hex');

     fd.on('end', function () {
        hash.end();
        // *** Here is my problem ***
        console.log(hash.read()); 
        if (cb) {
          cb(null, hash.read());
        }
     });

     fd.pipe(hash);
};

getHash('C:\\', function (error, data) {
   if (!error) { 
      // do something with data
   } 
});
const fs = require('fs');
const crypto = require('crypto');

function fileHashSync(filePath){
    var fileData;

    try{ fileData = fs.readFileSync(filePath, 'utf8'); }

    catch(err){
        if(err.code === 'ENOENT') return console.error('File does not exist. Error: ', err);

        return console.error('Error: ', err);
    }

    return crypto.createHash('sha1').update(fileData, 'utf8').digest('hex');
}