JSON массив для nodejs Поток читаемых объектов - PullRequest
0 голосов
/ 30 мая 2018

У меня есть событие, которое срабатывает при каждом получении пакета от устройства Bluetooth.Пакет поставляется в виде массива 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 голосов
/ 30 мая 2018

Вам потребуется реализовать поток Readable, который «оборачивает» ваш источник Bluetooth.Когда событие принятого пакета инициируется, вы перебираете свой массив объектов и вызываете метод push вашего читаемого потока, передавая каждый объект.Несколько похожий пример этого можно увидеть здесь

Обратите внимание, что, поскольку вы будете отправлять реальные объекты JSON, вы захотите включить опцию objectMode, когда будете писать свою реализацию, как описано здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...