从混合数据主体中解析nodejs流

时间:2020-10-30 22:42:44

标签: node.js json stream

nodejs新手,请耐心等待。

我有一个使用HTTP GET打开与摄像机的长连接的客户端。摄像头发送的混合数据块有时仅包含JSON,但是当有图片时,它将像这样将图片嵌入体内:

--MIME_boundary
Content-Type: application/json; charset="UTF-8"
Content-Length: 245

{
    "ipAddress":    "10.58.130.102",
    "portNo":   80,
    "protocol": "HTTP",
    "channelID":    3,
    "dateTime": "2020-10-30T10:51:48-04:00",
    "activePostCount":  1,
    "eventType":    "videoloss",
    "eventState":   "inactive",
    "eventDescription": "videoloss alarm"
}
--MIME_boundary
Content-Type: image/png; charset="UTF-8"
Content-Length: XXX

‰PNG

   
IHDR  
p      MrŠÄ   sRGB ®Îé   gAMA  ±üa     pHYs  à  ÃÇo¨d  ÿ¥IDATx^ìýù–$Éuæ Š»ÛâKì™@™‰L ˆ…Éêªê9U]EÉê>ó×ÌŸsææê)æQ¦¹YÓS§gŠ+¶›rGn±/¾Øê6ßï»"jjæjææ‘™þ¹«Š¨È•+W®\U5“k²öæ›ßž$aMÇÆÆZÚXo§özKñõ´¾¾žÖtLÓá!d&5&ã”Æ“I:Tä0çOÒØiëbvù·ÞJâŒCÊ5eWXÓõ”}î QçU‡Ûüã»éRw#=î
ÓžµHÇ$]ùÑ÷œ?#Z†§•÷,`‘ÎÀa3æ.¿ ˜W@¾>’­?øÙÛ©­qr(›ooLlÂi²–v)]øþ7Lv¡SÝ>Öê†_ÇÁˆÎ Ô?ËLüOˆç¦ÔùYçÅïÍÆÔ¿˜í¼ ýùâ›Ü…ÕÕ½„ò¼ÏÎ>ÎL½XÆòÌ¥­ß¾´ã¨(ásT@y58³}°ìÝeÑûÎ   ßxV%^\ÝsÁ‰»È/ŽO‹j-$µêˆÎ”<‰ðGæ>?9æêZm”åÜ“ÈyŽg¢ŸWb÷—¥ßz5íýòã´ó­¯Váî?+ý›¯fªEˆ0|÷NŽÓæ›/ûôß¹%)&3iG°ê4¢æįÝn§ÑhœÚ߸‘3„ù¦6ð\¦þ;Ÿ¥V«íÏŒ'“Cñ¾™sÐ(ï*“w}âY‚9A'Üs8>œ¤Ö×?™ÇäÃiÙ
‰¨æ¥ñ{w§×¹]èb}m#uŠ~Å«÷ögþ¬üõWÒH}¼&>­Öz
G*ù<ñPº{Щ`-Ž†©û­£}?

--MIME_boundary
Content-Type: application/json; charset="UTF-8"
Content-Length: 245

...<more JSON and IMAGES>...

这看起来像是流的绝佳候选者,所以我创建了这样的内容:

pipeline(
    needle.get(process.env.HIK_URL, hik_options),
    <topic of my question>,
    process.stdout,
    (err) => {
        if (err) {
            console.error('Pipeline failed', err);
        } else {
            console.log('Pipeline succeeded');
        }
    }
);

其中 needle 模块将返回提供HTTP输出的流,最终目的是使用 process.stdout 打印到控制台(或者做一些花哨的操作) JSON)和其他流处理器。

到目前为止,我的结论是我需要一种使用Transform Stream从流中提取JSON文本的方法。 为了避免重新发明轮子,尝试了一些可能有用的模块(例如“ JSONStream”:“ ^ 1.3.5”,“ json-scrape”:“ ^ 1.0.0”,“ split”:“ ^ 1.0。 1“)无济于事。最接近实际工作的是json-scrape,但是在读取图像后它将挂起并停止读取。不幸的是,它们都在第0行中失败(他们不希望使用--MIME ...或任何其他非JSON字符)

因此,我使用一些示例创建了一个Transform流:

var Transform = require('stream').Transform,
    util = require('util');

var ParserStream = function () {
    Transform.call(this, { objectMode: true });
};

util.inherits(ParserStream, Transform);

ParserStream.prototype._transform = function (chunk, encoding, callback) {

... rest of the transform stream

这就是我要坚持的地方:流的性质有时会向我发送一个漂亮的,可解析的 chunk ,它是一个完整的JSON。但是,考虑到图像内容的长度,有时候我有一个 chunk ,其中包含部分JSON,部分IMAGE,一半的JSON(当主体较大时)或仅IMAGE。

最好的nodejs方法是,仅解析流中的JSON内容,忽略图像字节并使输出成为以下可写流的完整对象?

感谢您的帮助。

0 个答案:

没有答案