Node.js流处理:生成文件哈希时输出混入原始文本的修复方法
如何修复Node.js中写入哈希值时同时包含源文件内容的问题?
你遇到的问题根源很明确:你同时用了两种方式往输出流里写内容——readData.pipe(writeData)会把源文件的所有内容直接复制到输出文件,而你又在end事件里把计算好的哈希值写入同一个输出流,所以最终结果就是源文本+哈希值的组合。
问题代码分析
看你这段代码:
const fs = require('fs'); const crypto = require('crypto'); const hash = crypto.createHash('MD5'); const readData = fs.createReadStream('./task1/input.txt'); const writeData = fs.createWriteStream('./task1/output.txt'); readData.on('data', (chunk) => { hash.update(chunk); }); readData.on('end', () => { const resultHash = hash.digest('hex'); writeData.end(resultHash); console.log(resultHash); }); readData.pipe(writeData); // 这行就是问题所在!
pipe()方法的作用是把可读流的所有数据直接导向可写流,相当于自动帮你把源文件的每一个chunk都写到输出文件里,和你手动计算哈希的逻辑完全独立,所以两者的内容都被写入了。
修复方案
只需要移除readData.pipe(writeData)这一行即可,这样输出流就只会在end事件里写入计算好的哈希值:
const fs = require('fs'); const crypto = require('crypto'); const hash = crypto.createHash('MD5'); const readData = fs.createReadStream('./task1/input.txt'); const writeData = fs.createWriteStream('./task1/output.txt'); readData.on('data', (chunk) => { hash.update(chunk); }); readData.on('end', () => { const resultHash = hash.digest('hex'); writeData.end(resultHash); console.log(resultHash); });
这样修改后,输出文件里就只会有MD5哈希值,不会再包含源文件的内容了。
内容的提问来源于stack exchange,提问作者Martin White
相关产品推荐
相关产品推荐

