Javascript 从node.js运行脚本,捕获标准输出,通过web套接字发送
我正在通过node.js调用一个Ruby脚本,它通过stdout返回数据,我已经设法让node将一些数据发送到它的web套接字,但是我缺少行,并且不太了解我在做什么。从研究来看,我似乎正在处理一个流,但我无法理解大部分文档,因为这些都是非常新的,而且超出了我的理解范围:( 当通过bashshell运行时,我的Ruby脚本输出如下到stdoutJavascript 从node.js运行脚本,捕获标准输出,通过web套接字发送,javascript,node.js,Javascript,Node.js,我正在通过node.js调用一个Ruby脚本,它通过stdout返回数据,我已经设法让node将一些数据发送到它的web套接字,但是我缺少行,并且不太了解我在做什么。从研究来看,我似乎正在处理一个流,但我无法理解大部分文档,因为这些都是非常新的,而且超出了我的理解范围:( 当通过bashshell运行时,我的Ruby脚本输出如下到stdout {element:“SENS02”,“data:{”type:“SEN”,“descr:“T100”} {“元素”:“SENS01”,“数据”:{“类型”
{element:“SENS02”,“data:{”type:“SEN”,“descr:“T100”}
{“元素”:“SENS01”,“数据”:{“类型”:“SEN”,“descr”:“}
{“元素”:“LED1”,“数据”:{“类型”:“LED”,“状态”:“1”}
{“元素”:“LED2”,“数据”:{“类型”:“LED”,“状态”:“0”}
当在控制台上运行时,一切都很好——当我通过node.js脚本调用它时,我只会得到每2行,例如node将输出
{element:“SENS02”,“data:{”type:“SEN”,“descr:“T100”}
{“元素”:“LED1”,“数据”:{“类型”:“LED”,“状态”:“1”}
我的node.js脚本部分如下
var cp=require('child_process');
var tail=cp.spawn('test.rb');
//从ruby脚本获取更新//
tail.stdout.on('data',函数(块){
var pumper=chunk.toString().slice(0,58);
var closer=JSON.parse(pumper);
插座.emit('MAP.room1',更近);
});
如果有人能帮忙的话,我偶尔也会遇到以下错误
未定义:0
^SyntaxError:输入意外结束
at Object.parse(本机)
我需要能够输出从我的ruby脚本收到的每一行。任何回答的人都请使用我自己的代码,而不是随机的例子,因为它只会让我在试图理解什么与什么相关以及“它对我意味着什么”时非常困惑。我试过看.pipe,但所有的例子都让我困惑,我不知道如何适应它ruby每次输出一行JS对象,我需要我的web套接字一次发出完全相同的东西1个对象
已完成console.log(chunk.toString())
以获得可读的输出
它缓解了一些奇怪的事情——额外的换行或其他什么
控制台的输出为
{"element":"SENS02","data":{"type":"SEN","descr":"T100"}}
{"element":"SENS01","data":{"type":"SEN","descr":" "}}
{"element":"LED1","data":{"type":"LED","state":"1"}}
{"element":"LED2","data":{"type":"LED","state":"0"}}
我怎样才能避免这个问题?这是否会导致我的另一个“输入端意外”错误
如果我执行var pumper=chunk.slice(0,-1);console.log(pumper.toString())
的操作,那么我将获得如上所示的输出,而没有奇数/额外/胭脂换行符。不过,我仍然不想进一步将其输出到web套接字
我可以从web套接字中获取此信息,但它表明我仍然\n不知何故
[“{”元素“:\”SENS02“,”数据“:{”类型“:”SEN“,”descr“:”T100\”}\n{”元素“:”SENS01“,”数据“:{”类型“:”SEN“,”descr“:\”}}
我需要把它放回一条平直的线,就像我在控制台上一样
因此,按照下面的建议操作之后,我现在通过使用此代码获得了所需的输出。我仍然得到了):控制台中记录的输入意外结束,这似乎是我从Ruby脚本中获得的其他换行符。在脚本运行了几天没有崩溃的情况下,所有数据似乎都完好无损地通过并解析到web套接字。我仍然需要仔细阅读并完全理解
的正在做什么,但是它似乎已经解决了我的问题
tail.stdout.on('data', function(chunk) {
var closer = chunk.toString()
var sampArray = closer.split('\n');
for (var i = 0; i < sampArray.length; i++) {
try {
var newObj = JSON.parse(sampArray[i]);
socket.emit('MAP.room1', newObj);
} catch (err) {
console.log('): ' + err.message);
}
}
});
tail.stdout.on('data',函数(块){
var closer=chunk.toString()
var sampArray=closer.split('\n');
对于(变量i=0;i
尝试spawn
在使用ruby脚本时,exec
正在缓冲输出,这可能就是您看到的原因
附言
使用try catch
块包装JSON.parse
,并打印失败时失败的数据如果要对每个数据块使用JSON.parse()
,则需要在换行符\n
上预分析每个块
JSON.parse
无法将多个由换行符分隔的对象解析为同一字符串中的两个不同对象。
这些是单独有效的:
这不是:
"{\"element\":\"SENS02\",\"data\":{\"type\":\"SEN\",\"descr\":\"T100\"}}\n{\"element\":\"SENS01\",\"data\":{\"type\":\"SEN\",\"descr\":\" \"}}"
如果目的是解析整个数据结构,那么您需要将ruby脚本的输出重新组织为类似于下面的内容
{
"elements": [
{
"name": "SENS02",
"data": {
"type": "SEN",
"descr": "T100"
}
},
{
"name": "SENS01",
"data": {
"type": "SEN",
"descr": " "
}
},
{
"name": "LED1",
"data": {
"type": "LED",
"state": "1"
}
},
{
"name": "LED2",
"data": {
"type": "LED",
"state": "0"
}
}
]
}
如何解析输入(粗略示例)
“数据”方面,除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外以外,除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了,“state\:\“0\”};
var sampArray=sample.split('\n');
对于(变量i=0;i
感谢您的清理-尽管差异显示了大量我看不到的更改。为了帮助.slice(0,58)
我必须添加,以确保发送到JSON.parse的块的数量正确-这可能是我崩溃的原因。我尝试使用.split('\n'),但似乎也没有像预期的那样工作。在对其进行切片或JSON解析之前,您能否只使用console.log(chunk)
?最好看看它输出了什么,看看它是否真的每隔一行就删除一行。因此,基于该输出,我认为您不需要添加上面的toString()
或slice()
,只需将其获取并提供给JSON.parse
。对于这一点,只需将它发送到JSON.parse
,如果有什么东西,那么首先检查if(chunk)
。并用
{
"elements": [
{
"name": "SENS02",
"data": {
"type": "SEN",
"descr": "T100"
}
},
{
"name": "SENS01",
"data": {
"type": "SEN",
"descr": " "
}
},
{
"name": "LED1",
"data": {
"type": "LED",
"state": "1"
}
},
{
"name": "LED2",
"data": {
"type": "LED",
"state": "0"
}
}
]
}
var sample = "{\"element\":\"SENS02\",\"data\":{\"type\":\"SEN\",\"descr\":\"T100\"}}\n{\"element\":\"SENS01\",\"data\":{\"type\":\"SEN\",\"descr\":\" \"}}\n{\"element\":\"LED1\",\"data\":{\"type\":\"LED\",\"state\":\"1\"}}\n{\"element\":\"LED2\",\"data\":{\"type\":\"LED\",\"state\":\"0\"}}";
var sampArray = sample.split('\n');
for (var i = 0; i < sampArray.length; i++) {
try {
var newObj = JSON.parse(sampArray[i]);
// socket.emit(newObj);
} catch (err) {
console.log('): ' + err.message);
}
}