我将request
package与crypto
一起使用。似乎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
。
我无法理解这种行为的原因是什么?文档中说明了哪些内容?
答案 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
。