当我通过流传输图像文件之类的东西时,有什么方法可以一起发送元对象吗?
我的服务器收到用户发送的图像。图像通过一组执行各种操作的流推送。
最后的流发出一个data事件,它将生成的图像缓冲区传递到回调中,但我丢失了用户的所有上下文。我需要将生成的图像与用户的 ID 和其他一些元数据相关联。
理想的:
stream.on('data', function(img, meta){
...
})
Run Code Online (Sandbox Code Playgroud)
感谢任何可能的解决方案!
简而言之,不,Node.js 中没有内置任何内容来支持将元数据包含在流中。不过,您确实还有其他一些选择,包括:
您可以使用闭包来单独跟踪流中的元数据。例如:
function handleImage(imageStream) {
var meta = {...};
imageStream.pipe(otherStreams).on('data', function(image) {
// you now have `image` and `meta` variables at your disposal here.
}
}
Run Code Online (Sandbox Code Playgroud)
这样做的缺点是元数据不可用于您的otherStreams.
如果您的其他流是您无法控制的第三方代码,或者它们不需要了解元数据,那么这是一个很好的解决方案。
您可以执行类似于 HTTP 标头的操作,其中某个点之前的所有数据都是元数据,其后的所有数据都是图像。(在 HTTP 中,分隔符是\n\n最先出现的位置。)链中的所有流都必须了解这一点并处理它。
如果您知道您的元数据将始终位于一个块中,并且您的流都不会拆分或合并块,那么您可以稍微简化一下,只说第一个(或最后一个)块始终是元数据。
切换到像 Amoli 在他的回答中提到的对象流。在这里你会通过{image: imgData, meta: {...}}。然后,您必须更新其他流以适应这种格式。
不过,这种方法的主要缺点是,您要么必须多次传递元数据,为每个需要元数据的流缓存它,要么将整个图像作为一个块传递(这会破坏“流”的整个点) ”)。而且,据我所知,node.js 可以比对象流更好地优化文本/二进制流。因此,对于您的情况来说,这可能不是一个好方法。
https://github.com/dominictarr/mux-demux在这里可能会有所帮助。它将多个流合并为一个,因此您可以拥有单独的图像和元流。但我不确定它对你的情况有多有效。您可能需要更新所有流才能意识到这一点。
我知道我说过,除了第一个选项之外的所有选项都需要修改其他流,但有一种解决方法:您可以创建一个通用的“流包装器”,它将图像和元数据分开,并仅将图像数据传递到主流流,并使元数据绕过它并继续到链上的下一个。但这很快就会变得丑陋,所以可能不是最好的主意。
| 归档时间: |
|
| 查看次数: |
2857 次 |
| 最近记录: |