当前位置: 首页 > 面试题库 >

逐行解析生成的node.js子进程的输出

邹祺然
2023-03-14
问题内容

我有一个PhantomJS /
CasperJS脚本,它是使用node.js脚本运行的process.spawn()。由于CasperJS不支持require()ing模块,因此我试图将CasperJS中的命令打印到stdout,然后使用来从我的node.js脚本中读取它们,spawn.stdout.on('data', function(data) {});以执行将对象添加到redis /
mongoose的操作(复杂,是的,但是看起来比为此设置Web服务更简单。。。)CasperJS脚本执行一系列命令,并创建例如20个屏幕截图,需要将其添加到我的数据库中。

但是,我不知道如何将data变量(a
Buffer?)分成几行…我尝试将其转换为字符串,然后进行替换,我尝试进行操作,spawn.stdout.setEncoding('utf8');但似乎无济于事。

这是我现在所拥有的

var spawn = require('child_process').spawn;

var bin = "casperjs"
//googlelinks.js is the example given at http://casperjs.org/#quickstart
var args = ['scripts/googlelinks.js'];
var cspr = spawn(bin, args);

//cspr.stdout.setEncoding('utf8');
cspr.stdout.on('data', function (data) {
    var buff = new Buffer(data);
    console.log("foo: " + buff.toString('utf8'));
});

cspr.stderr.on('data', function (data) {
    data += '';
    console.log(data.replace("\n", "\nstderr: "));
});

cspr.on('exit', function (code) {
    console.log('child process exited with code ' + code);
    process.exit(code);
});

https://gist.github.com/2131204


问题答案:

试试这个:

cspr.stdout.setEncoding('utf8');
cspr.stdout.on('data', function(data) {
  var str = data.toString(), lines = str.split(/(\r?\n)/g);
  for (var i=0; i<lines.length; i++) {
    // Process the line, noting it might be incomplete.
  }
});

请注意,“数据”事件不一定在输出的两行之间平均中断,因此一行可能跨越多个数据事件。



 类似资料:
  • 问题内容: 这似乎是一个基本问题,但是我找不到任何文档: 分叉和生成node.js进程有什么区别?我已经读过分叉是生成的一种特殊情况,但是使用它们的不同用例/重用分别是什么? 问题答案: Spawn是用于运行系统命令的命令。运行spawn时,会向其发送系统命令,该命令将在其自己的进程上运行,但不会在节点进程内执行任何其他代码。您可以为生成的进程添加侦听器,以允许您的代码与生成的进程进行交互,但是不

  • 问题内容: 我有一个脚本,输出“ hi”,睡眠一秒钟,输出“ hi”,睡眠1秒,依此类推。现在,我认为我可以使用此模型解决此问题。 现在的问题是,需要完成任务才能显示输出。据我了解,这是由于新产生的进程接受了执行控制。显然,node.js不支持线程,那么有什么解决方案吗?我的想法是可能运行两个实例,第一个实例用于创建任务的特定目的,并考虑到可以实现的目的,将其通过管道将输出传递给第二个实例的进程。

  • 问题内容: 目的:使用指定的参数调用外部应用程序,然后退出脚本。 以下脚本无法正常工作: 尝试过的事情:-不分离。提前谢谢了 问题答案: 从node.js文档中: 默认情况下,父级将等待分离的子级退出。为防止父级等待给定的子级,请使用child.unref()方法,并且父级的事件循环将其引用计数中不包括该子级。 使用detached选项启动长时间运行的进程时,除非该进程提供了未连接到父级的stdi

  • 问题内容: 我的python脚本使用子进程来调用非常嘈杂的linux实用程序。我想将所有输出存储到日志文件中,并向用户显示其中的一些内容。我以为下面的方法可以工作,但是直到实用程序产生大量输出后,输出才出现在我的应用程序中。 我真正想要的行为是过滤器脚本打印从子流程接收到的每一行。像是做什么,但带有python代码。 问题答案: 自从我上一次使用Python以来已经很长时间了,但是我认为问题出在语

  • 问题内容: 我正在尝试调试使用以下方法创建的子Node.JS进程: 问题是,在IntelliJ / WebStorm中运行时,父进程和子进程都在同一端口上启动。 因此,它仅调试父进程。 有什么方法可以设置IntelliJ来调试子进程或强制其在其他端口上启动,以便我可以在远程调试中进行连接? 问题答案: 这是node.js中一个已知的错误,该错误最近已得到修复(尽管未反向移植到v0.10)。 有关更

  • 问题内容: 如何停止subprocess.Popen的输出?如果打印量很大,有时打印速度可能会很慢。 问题答案: 如果要完全丢弃它: 如果您使用的是Python 2.5,则将需要使用,或者只是不使用。