JSON数组到nodejs可读对象流

时间:2018-05-30 15:47:09

标签: javascript node.js stream

每次从蓝牙设备收到数据包时,我都会触发一个事件。数据包作为JSON数组进入,并且总是包含10个类似于下面的对象。

var s1_data = [{"record":0,"sensor":1,"timestamp":26566,"date":{"day":7,"hour":10,"minute":45,"month":5,"second":38,"year":18}},
{"record":1,"sensor":1,"timestamp":26567,"date":{"day":7,"hour":10,"minute":45,"month":5,"second":38,"year":18}},
{"record":2,"sensor":1,"timestamp":26568,"date":{"day":7,"hour":10,"minute":45,"month":5,"second":38,"year":18}},
{"record":3,"sensor":1,"timestamp":26569,"date":{"day":7,"hour":10,"minute":45,"month":5,"second":38,"year":18}},
{"record":4,"sensor":1,"timestamp":26570,"date":{"day":7,"hour":10,"minute":45,"month":5,"second":38,"year":18}},
{"record":5,"sensor":1,"timestamp":26571,"date":{"day":7,"hour":10,"minute":45,"month":5,"second":38,"year":18}},
{"record":6,"sensor":1,"timestamp":26572,"date":{"day":7,"hour":10,"minute":45,"month":5,"second":38,"year":18}},
{"record":7,"sensor":1,"timestamp":26573,"date":{"day":7,"hour":10,"minute":45,"month":5,"second":38,"year":18}},
{"record":8,"sensor":1,"timestamp":26574,"date":{"day":7,"hour":10,"minute":45,"month":5,"second":38,"year":18}},
{"record":9,"sensor":1,"timestamp":26575,"date":{"day":7,"hour":10,"minute":45,"month":5,"second":38,"year":18}}]

我需要将每个单独的对象推送到另一个流所使用的node.js流中。

任何人都可以举例说明如何将这些内容持续推送到可读对象流(或者我是否需要使用PassThrough流)?我似乎无法理解如何做到这一点!

已编辑,可在下方添加示例代码。 chunk.toString()因块未定义而失败

var Readable = require('stream').Readable;
var util = require('util');
var through2 = require('through2');

var s1 = require('./sensor1.js');
var s2 = require('./sensor2.js');

var minLength = s1.length;
//console.log(s1);
var s1stream = new Readable({ objectMode: true });
var s2stream = new Readable({ objectMode: true });


s1stream._read = function () {
    this.push();
};

s2stream._read = function () {
    this.push();
};

if (s2.length < minLength){
  minLength = s2.length;
}

var n1 = 0;
setInterval(function() {
    if (n1++ < minLength) {
        console.log(s1[n1].record);
        s1stream.push(s1[n1]);
    } else if (n1++ === minLength) {
        s1stream.push(null);
    }
}, 1000);

var n2 = 0;
setInterval(function() {
    if (n2++ < minLength) {
        s2stream.push(s2[n2]);
    } else if (n2++ === minLength) {
        s2stream.push(null);
    }
}, 1000);


s1stream.pipe(through2.obj(function (chunk, enc, callback) {
    this.push(chunk.toString())
    callback()
  })).pipe(process.stdout);

下面的编辑显示了工作代码。看起来这与我创建 read 函数

的方式有关
var Readable = require('stream').Readable;
var util = require('util');
var through2 = require('through2');
var Transform = require('stream').Transform;

var s1 = require('./sensor1.js');
var s2 = require('./sensor2.js');

var minLength = s1.length;
//console.log(s1);

var s1stream = new Readable({
   objectMode: true,
   read() {}
 })

 const s2stream = new Readable({
    objectMode: true,
    read() {}
  })

if (s2.length < minLength){
  minLength = s2.length;
}

var n1 = 0;
setInterval(function() {
    if (n1 < minLength) {
        s1stream.push(s1[n1]);
        n1++;
    } else if (n1 == minLength) {
        s1stream.push(null);
    }
}, 1000);

var n2 = 0;
setInterval(function() {
    if (n2++ < minLength) {
        s2stream.push(s2[n2]);
    } else if (n2++ === minLength) {
        s2stream.push(null);
    }
}, 1000);

var jsonStream = through2.obj(function(file, encoding, cb) {
    this.push(file.record.toString())
    cb()
})

s1stream.pipe(jsonStream).pipe(process.stdout);

1 个答案:

答案 0 :(得分:0)

您需要实现一个“包装”蓝牙源的可读流。当数据包接收事件被触发时,您将遍历对象数组并调用可读流的push方法,传入每个对象。可以看到一个类似的例子here

请注意,由于您将发送实际的JSON对象,因此在编写实现时需要启用objectMode选项here

相关问题