为什么crypto.createHash()在调用setEncoding()之前不可写?

时间:2017-04-07 11:34:42

标签: node.js node-request node-crypto node-streams

我将request packagecrypto一起使用。似乎request实现了遗留stream协议和don't write任何数据到管道目的地,直到writable为止。

Stream.prototype.pipe = function(dest, options) {
  var source = this;

  function ondata(chunk) {
    if (dest.writable) {
      if (false === dest.write(chunk) && source.pause) {
        source.pause();
      }
    }
  }
...

所以,如果我使用下一个代码:

const crypto = require('crypto'); 
const request = require('request');

var hasher = crypto.createHash('sha256'); 
// Uncomment the line below to fix!
// hasher.setEncoding('hex');
console.log(hasher.writable); 
request('http://ya.ru').pipe(hasher).on('finish', function() {
    console.log('Hash is', hasher.read()); 
});

它产生sha256('')(即从空值)。但是,当我使用hasher.setEncoding('hex')时,代码生成sha256(<response_body>)hasher.writable生成true

我无法理解这种行为的原因是什么?文档中说明了哪些内容?

1 个答案:

答案 0 :(得分:0)

最后,Node中有一个bug。这里有更小的代码示例来重现它:

var hasher = crypto.createHash('sha256'); 
const _ = hasher._writableState;  // we don't even have to call .setEnconding() here
console.log(hasher.writable);

Stream1实现required this.writable在目标流中为true。

Stream.prototype.pipe = function(dest, options) {
  var source = this;

  function ondata(chunk) {
    if (dest.writable) {
      if (false === dest.write(chunk) && source.pause) {
        source.pause();
      }
    }
  }

  source.on('data', ondata);
  ...

调用hasher.setEncoding('hex')(或对this._writableState的任何其他访问)触发了对流的实际构造函数的调用。在this.writable之前undefined