这个小的Javascript程序返回其文本的sha256散列。
const shasum = require('crypto').createHash('sha256');
const stream = require('fs').createReadStream(__filename);
stream.on('error', function() { console.log('Error.'); });
stream.on('data', function (chunk) { shasum.update(chunk); }); /* <--- data line */
stream.on('end', function() {
const sha = shasum.digest('base64');
console.log(`The sha is ${sha}`);
});使用Nodejs Erbium执行,它按预期工作。
然而,在写完它之后,我认为函数表达式是不需要的,所以我用以下代码更改了data line:
stream.on('data', shasum.update);
它崩溃了,并显示了一条可怕的错误消息:
if (state[kFinalized])
^
TypeError: Cannot read property 'Symbol(kFinalized)' of undefined
at ReadStream.update (internal/crypto/hash.js:78:12)
at ReadStream.emit (events.js:311:20)
at addChunk (_stream_readable.js:294:12)
at readableAddChunk (_stream_readable.js:275:11)
at ReadStream.Readable.push (_stream_readable.js:209:10)
at internal/fs/streams.js:210:12
at FSReqCallback.wrapper [as oncomplete] (fs.js:487:5)Javascript对于函数调用非常灵活,但是according to the documentation stream.on data调用应该只传递一个参数。
为什么行为会有所不同?
发布于 2020-08-06 14:33:33
问题在于上下文。
流将把data函数绑定到流本身
stream.on('data', function (chunk) {
console.log(this) // it is the `stream`
shasum.update(chunk)
})在这种情况下,shasum.update绑定到流,因此更新函数将不起作用:
function update(data, encoding) {
const state = this[kState];
if (state[kFinalized])
throw new ERR_CRYPTO_HASH_FINALIZED();要使其正常工作,您必须编写以下语句:
stream.on('data', shasum.update.bind(shasum))https://stackoverflow.com/questions/63277897
复制相似问题