Node.js 仅当摘要通过时才传递流

Node.js 仅当摘要通过时才传递流,node.js,node-streams,Node.js,Node Streams,我在express.js模块中有一个管道,在这个管道中,我获取一个文件,解密它,通过摘要传递它以确保它是有效的,然后如果摘要传递,我想将它作为响应返回。代码如下所示: function GetFile(req,res) { ... }).then(() => { var p1 = new Promise(function(resolve,reject) { digester = digestStream("md5", "hex", f

我在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()
直接发送到缓冲区,我找不到太多的信息。我能找到的最接近的东西是模块,但是在该模块演示如何将管道连接到收集数据的函数的部分中,提到了以下警告:

请注意,当您像这样使用回调方法时,结果 数据参数是列表中所有缓冲区对象的串联。 如果您希望避免这种连接的开销(在 极端性能意识),然后避免回调方法和 只需听“end”,就像标准流一样


我对
bl
不够熟悉,无法理解这对于效率的真正意义。具体地说,我不明白它为什么在谈论连接缓冲区对象——例如,为什么必须连接多个缓冲区对象?)。我不确定如何遵循它的建议,仍然有一个简单的管道。

当它被管道连接到时,
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)
    ...
}