我在express.js模块中有一个管道,我在其中获取文件,解密它,通过摘要传递它以确保它是有效的,然后如果摘要通过则想要将其作为响应返回。代码看起来像这样:
function GetFile(req,res) {
...
}).then(() => {
var p1 = new Promise(function(resolve,reject) {
digester = digestStream("md5", "hex", function(md5,len) {
// compare md5 and length against expected values
// what do i do if they don't match?
resolve()
}
}
infile.pipe(decrypter).pipe(digester).pipe(res)
return p1
}).then(() => {
...
}
问题是,一旦我将输出传递给res
,无论摘要是否通过,它都会管道输出。但是,如果我不将蒸煮器的输出管道输送到任何东西,那么没有任何反应 - 我想没有来自右端的压力来移动数据。
我可以简单地运行两次解密管道,事实上这就是之前所做的,但我正在尝试加快速度,所以一切都只发生一次。我的一个想法是将消化器输出管道传输到缓冲区,如果摘要匹配,则将缓冲区发送到res
。这将需要与文件大小成比例的内存,这在大多数情况下并不可怕。但是,我找不到如何.pipe()
直接到缓冲区。我能找到的最接近的是bl模块,但是在它演示收集数据的函数的管道部分中,提到了这个警告:
请注意,当您使用这样的回调方法时,会产生结果 data参数是列表中所有Buffer对象的串联。 如果你想避免这种连接的开销(在情况下) 极端的表现意识),然后避免回调方法和 只是听'结束',就像标准的流。
我对bl
不够熟悉,无法理解这对于它的效率究竟意味着什么。具体来说,我不明白为什么它在谈论连接缓冲区对象 - 例如,为什么必须连接多个缓冲区对象?)。我不确定如何遵循它的建议,仍然有一个简单的管道。
答案 0 :(得分:0)
bl
模块将在管道传输时收集缓冲区。多少缓冲区取决于输入流的作用。如果您不想将它们连接在一起,请将它们存储在BufferList中,如果哈希值通过,则将BufferList传递给您的输出。
这样的事情对我有用:
function GetFile(req,res) {
...
var bl
}).then(() => {
var p1 = new Promise(function(resolve,reject) {
digester = digestStream("md5", "hex", function(md5,len) {
if (md5 != expectedmd5) throw "bad md5"
if (len != expectedlen) throw "bad length"
resolve()
}
}
bl = new BufferList()
infile.pipe(decrypter).pipe(digester).pipe(bl)
return p1
}).then(() => {
bl.pipe(res)
...
}