2017-08-02 71 views
0

我需要创建一个读取文档的程序,对其进行加密并将结果写入另一个文档。所有这些都应该使用变换流完成。 Here's我的代码:无法实现转换流

"use strict"; 
const fs = require("fs"); 
const crypto = require("crypto"); 
const Transform = require("stream").Transform; 

// Make read and write streams 
const input = fs.createReadStream("./logs/data.txt"); 
let output = fs.createWriteStream("./logs/newdata.txt"); 

// 2 functions that encrypt data and transform it 
class CT extends Transform { 
    constructor() { 
    super(); 
    } 

    // Encryption function 
    makeHash(err, data) { 
    if (err) throw err; 
    return crypto.createHash("md5").update(data).digest("hex") 
    } 

    // Encryption function will be passed as a callback 
    _transform(data, encoding, callback) { 
    callback(null, data); 
    } 
} 

let data; 

// Make transform stream 
let tr = new CT; 
input.on("readable",() => { 
    while (data = input.read()) { 
    tr._transform(data, "utf8", tr.makeHash); 
    console.log(data.toString()); 
    console.log(tr.makeHash(null, data)); 
    output.write(data, "utf8",() => { 
     output.end(); 
     console.log("Done writing the file"); 
    }); 
    } 
}); 

input.on("error", (err) => { 
    console.error(`Unexpected ${err}`); 
}); 

input.on("end",() => { 
    console.log("Done reading the file"); 
}); 

当我运行这个程序,控制台显示我说:

TextInfo 
a0b5dfe30f8028ab86b1bb48b8f42ebb 
Done reading the file 
Done writing the file 

这意味着,它首先读取和写入文档,但结果是不加密的(“TextInfo “) - 而应该看起来像这样”a0b5dfe30f8028ab86b1bb48b8f42ebb“。我确定转换流逻辑中存在一个错误。

任何帮助将不胜感激!

+0

'output.write(tr._transform(' –

+0

@AikonMogwai你的意思是我需要通过tr._transform(数据, “UTF8”,TR? makeHash)作为output.write的参数?在这种情况下,程序不起作用,TypeError:无法读取未定义的属性'length' –

回答

0

我的错误#1是我创建了一个读取流 - 相反,我应该声明变量输入读取文件,并在回调中使用变换流来写入其内容。

错误#2是我错误地实现了函数makeHash:现在它完美的加密和写入文件。所以这个函数被称为_transform函数的回调函数。

Here's工作代码:

"use strict"; 
const fs = require("fs"); 
const crypto = require("crypto"); 
const Transform = require("stream").Transform; 

const input = fs.readFile("./logs/data.txt", "utf8", (err, content) => { 
    if (err) throw err; 
    tr.write(content); 
}); 
let output = fs.createWriteStream("./logs/newdata.txt"); 

class CT extends Transform { 
    constructor() { 
    super(); 
    } 
    // Function declares cData - encrypted input text and writes it to the file 
    makeHash(err, data) { 
    let cData = crypto.createHash("md5").update(data).digest("hex"); 
    output.write(cData, "utf8",() => { 
     output.end(); 
     console.log("Done writing the file"); 
    }); 
    } 

    _transform(chunk, encoding, callback) { 
    callback(null, chunk); 
    } 
} 

let tr = new CT; 
tr.on("data", (chunk) => tr._transform(chunk, "utf8", tr.makeHash)); 

tr.on("error", (err) => { 
    console.error(`Unexpected ${err}`); 
});