【问题标题】:Passing a stream only if digest passes仅当摘要通过时才传递流
【发布时间】:2018-05-29 04:23:21
【问题描述】:

我在 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 对象的串联。 如果您想避免这种连接的开销(在 极端的性能意识),然后避免回调方法和 只需听 'end' 代替,就像标准 Stream 一样。

我对@9​​87654326@ 不够熟悉,无法理解这对于效率的真正含义。具体来说,我不明白为什么它在谈论连接缓冲区对象 - 例如,为什么必须连接一个以上的缓冲区对象?)。我不知道我怎样才能听从它的建议并且仍然有一个简单的管道。

【问题讨论】:

    标签: node.js node-streams


    【解决方案1】:

    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)
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-16
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 2013-05-20
      • 2015-05-02
      • 2011-08-20
      • 2021-04-08
      • 1970-01-01
      相关资源
      最近更新 更多