node.js - 仅当摘要通过时才传递流
问题描述
我在 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模块,但是在它演示管道到收集数据的函数的部分中,提到了这个警告:
请注意,当您像这样使用回调方法时,生成的数据参数是列表中所有 Buffer 对象的串联。如果您想避免这种连接的开销(在极端性能意识的情况下),那么请避免使用回调方法,而只听“end”,就像标准的 Stream。
我还不够熟悉,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)
...
}
推荐阅读
- java - 用递归评估二叉树
- swift - SwiftUI navigationBarItems 在 TabView 中消失
- django - 如何通过 Django Model 表单插入外键数据
- python - 如何检查列表中是否仅存在两个特定值
- python - 在 Python 中实现 Rijndael MixColums 的麻烦
- android - 如何使用 LiveData 在活动之间共享数据?
- flutter - 创建可调整大小的视图,当在 FLUTTER 中从角落和侧面捏或拖动时调整大小
- javascript - 为什么启用keep-alive时ioredis客户端超时?
- python - 如果两个字典中的项目都匹配,则减法工作错误
- css - 如何为元素的变换设置动画,使其从上方落向屏幕?