Node.js 子进程输出到socket.io

Node.js 子进程输出到socket.io,node.js,Node.js,请原谅这个愚蠢的问题,如果是这样的话,我对Node还比较陌生 我正在节点服务器上生成一个子进程,以便将数据集导入数据库。子进程使用参数执行osm2pgsl,它有自己的内部输出,显示当前处理的数据和已处理的计数 我有一个简单的节点脚本来生成这个进程,并在它到达时记录来自这个进程的信息。我需要访问的主要信息不是通过stdout、stderr或在上轮询的,这是有问题的 节点脚本 var util = require('util'), spawn = require('child_proces

请原谅这个愚蠢的问题,如果是这样的话,我对Node还比较陌生

我正在节点服务器上生成一个子进程,以便将数据集导入数据库。子进程使用参数执行
osm2pgsl
,它有自己的内部输出,显示当前处理的数据和已处理的计数

我有一个简单的节点脚本来生成这个进程,并在它到达时记录来自这个进程的信息。我需要访问的主要信息不是通过stdout、stderr或在上轮询的,这是有问题的

节点脚本

var util  = require('util'),
    spawn = require('child_process').spawn,
    file = process.argv[2],
    ls    = spawn('osm2pgsql', ['--slim', '-d', 'gis', '-U', 'postgres', '--number-processes', '3', file]);

ls.stdout.on('data', function (data) {
  process.stdout.write('Currently processing: ' + data.toString() + '\r');
});

ls.stderr.on('data', function (data) {
  console.log('stderr: ' + data.toString());
});

ls.on('exit', function (code) {
  console.log('child process exited with code ' + code.toString());
});
Mid: pgsql, scale=100 cache=800
Setting up table: planet_osm_nodes

stderr: NOTICE:  table "planet_osm_nodes" does not exist, skipping

stderr: Setting up table: planet_osm_ways

stderr: NOTICE:  table "planet_osm_ways" does not exist, skipping

stderr: Setting up table: planet_osm_rels

stderr: NOTICE:  table "planet_osm_rels" does not exist, skipping

stderr: 
Reading in file: /OSMDATA/great-britain-latest.osm.pbf

Processing: Node(10k 10.0k/s) Way(0k 0.00k/s) Relation(0 0.00/s)
Processing: Node(20k 20.0k/s) Way(0k 0.00k/s) Relation(0 0.00/s)
Processing: Node(30k 30.0k/s) Way(0k 0.00k/s) Relation(0 0.00/s)
输出

var util  = require('util'),
    spawn = require('child_process').spawn,
    file = process.argv[2],
    ls    = spawn('osm2pgsql', ['--slim', '-d', 'gis', '-U', 'postgres', '--number-processes', '3', file]);

ls.stdout.on('data', function (data) {
  process.stdout.write('Currently processing: ' + data.toString() + '\r');
});

ls.stderr.on('data', function (data) {
  console.log('stderr: ' + data.toString());
});

ls.on('exit', function (code) {
  console.log('child process exited with code ' + code.toString());
});
Mid: pgsql, scale=100 cache=800
Setting up table: planet_osm_nodes

stderr: NOTICE:  table "planet_osm_nodes" does not exist, skipping

stderr: Setting up table: planet_osm_ways

stderr: NOTICE:  table "planet_osm_ways" does not exist, skipping

stderr: Setting up table: planet_osm_rels

stderr: NOTICE:  table "planet_osm_rels" does not exist, skipping

stderr: 
Reading in file: /OSMDATA/great-britain-latest.osm.pbf

Processing: Node(10k 10.0k/s) Way(0k 0.00k/s) Relation(0 0.00/s)
Processing: Node(20k 20.0k/s) Way(0k 0.00k/s) Relation(0 0.00/s)
Processing: Node(30k 30.0k/s) Way(0k 0.00k/s) Relation(0 0.00/s)
stderr:
行中,您可以看到我能够访问该流,但是
处理:…
是我首先需要访问的。这是从子进程内部打印的,我不确定如何直接访问它

是否有任何方法可以从我的Nodejs服务器中访问输出(如上)


编辑:我打算通过管道将此输出传输到Socket.io,但我需要先访问它,因此才有了标题。

找到了答案,但它可能对未来的人们有用

由于
处理:…
使用
osm2pgsql
源代码中的
\r
在一行上递归更新,因此它实际上是以与其他所有内容相同的方式从
stderr
中生成的

处理的输出:…
实际上是以下行:

stderr: 
Reading in file: /OSMDATA/great-britain-latest.osm.pbf

Processing: Node(10k 10.0k/s) Way(0k 0.00k/s) Relation(0 0.00/s)
我没有想到输出可能有多行

我能够通过
ls.stderr.on('data',function(data){})访问输出