首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JSON数组转换为nodejs可读对象流

JSON数组转换为nodejs可读对象流
EN

Stack Overflow用户
提问于 2018-05-30 23:47:09
回答 1查看 1.8K关注 0票数 0

我有一个事件,每当从蓝牙设备接收到数据包时都会触发。数据包以JSON数组的形式传入,并始终包含10个对象,类似于下面的对象。

代码语言:javascript
复制
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()失败,因为块是未定义的

代码语言:javascript
复制
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 functions的方式有关

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-31 00:28:42

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50608850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档