Node.js:将请求的inputinput到crypto.hash中

我想从URL中计算资源的散列(例如PDF)。 为此,我写了

const computeHash = co.wrap(function* main(url) { const response = yield promisify(request)(url); // assume response.status === 200 const buf = new Uint8Array(response.arrayBuffer); const hash = crypto.createHash('sha1'); hash.update(buf, 'binary'); return hash.digest('hex'); }); 

要使用的

 const hash = yield computeHash('http://arxiv.org/pdf/1001.1234v3.pdf'); 

我喜欢的代码是:

  • 这是一个发电机,所以我可以yield它。 距离async / await只有一步之遥。

我不喜欢的东西:

  • 它没有正确计算散列。 🙂
  • request完成,响应主体作为一个整体传送到hash函数中。 我宁愿将request的输出request给散列函数。

任何提示?

crypto.createHash()提供了一个Hash实例,当前支持两个接口:legacy( update()digest() )和stream。 你不需要做任何特殊的事情来使用其中的任何一个,所以将响应stream式传输到散列stream就像下面这样简单:

 var hasher = crypto.createHash('sha1'); hasher.setEncoding('hex'); request(url).pipe(hasher).on('finish', function() { console.log('Hash is', hasher.read()); }); 

这就是通常的callback方式,但是我不确定你会怎样工作,因为我对发电机和其他方面不够熟悉。