如何使用node.js从stdin逐行传输数据并发送到客户端?

如何使用node.js从stdin逐行传输数据并发送到客户端?,node.js,streaming,pipe,stdin,Node.js,Streaming,Pipe,Stdin,我试图做的是从一个scala文件中设置一个流,该文件正在写入标准输出,并通过管道输出到node.js。e、 g.writing.scala | node index.js然后,在node.js中,我想读取每一行输入的内容并将其发送给客户端。有人知道我该怎么做吗?有没有更好的方法来完成同样的事情?最简单的方法是使用以下函数从节点应用程序中调用您的scala程序: var express = require('express'); var exec = require('child_process'

我试图做的是从一个scala文件中设置一个流,该文件正在写入标准输出,并通过管道输出到node.js。e、 g.writing.scala | node index.js然后,在node.js中,我想读取每一行输入的内容并将其发送给客户端。有人知道我该怎么做吗?有没有更好的方法来完成同样的事情?

最简单的方法是使用以下函数从节点应用程序中调用您的
scala
程序:

var express = require('express');
var exec = require('child_process').exec;
var app = express();

app.get('/', function(req, res){
  exec('your scala program',
    function (error, stdout, stderr) {
      res.send(stdout);
  });
});

app.listen(3000);
如果你不在乎错误,你可以使用
管道
来加速你的应用程序。在这种情况下,
节点
将在调用scala程序后立即开始向客户端发送数据。我不能完全确定语法,但应该是这样的:

var express = require('express');
var exec = require('child_process').exec;
var app = express();

app.get('/', function(req, res){
  var child = exec('your scala program');
  child.stdout.pipe(res);
});

app.listen(3000);
...
exec('your scala program',
  function (error, stdout, stderr) {
    stdout.pipe(res);
});
...

最简单的方法是使用以下函数从节点应用程序中调用您的
scala
程序:

var express = require('express');
var exec = require('child_process').exec;
var app = express();

app.get('/', function(req, res){
  exec('your scala program',
    function (error, stdout, stderr) {
      res.send(stdout);
  });
});

app.listen(3000);
如果你不在乎错误,你可以使用
管道
来加速你的应用程序。在这种情况下,
节点
将在调用scala程序后立即开始向客户端发送数据。我不能完全确定语法,但应该是这样的:

var express = require('express');
var exec = require('child_process').exec;
var app = express();

app.get('/', function(req, res){
  var child = exec('your scala program');
  child.stdout.pipe(res);
});

app.listen(3000);
...
exec('your scala program',
  function (error, stdout, stderr) {
    stdout.pipe(res);
});
...

Leonids的回答是98%正确的,因为
res
是一个可写流,
stdout
是一个可读流,所以代码应该这样写:

var express = require('express');
var exec = require('child_process').exec;
var app = express();

app.get('/', function(req, res){
  var child = exec('your scala program');
  child.stdout.pipe(res);
});

app.listen(3000);
...
exec('your scala program',
  function (error, stdout, stderr) {
    stdout.pipe(res);
});
...

Leonids的回答是98%正确的,因为
res
是一个可写流,
stdout
是一个可读流,所以代码应该这样写:

var express = require('express');
var exec = require('child_process').exec;
var app = express();

app.get('/', function(req, res){
  var child = exec('your scala program');
  child.stdout.pipe(res);
});

app.listen(3000);
...
exec('your scala program',
  function (error, stdout, stderr) {
    stdout.pipe(res);
});
...

谢谢您的更正,但根据
child\u process.exec
文档,
回调中的
stdout
缓冲区,而不是
可读流
。这是因为当子进程终止时,
exec
调用它的回调。但是
excec
函数返回带有
stdout
属性的
ChildProcess
对象,该属性是
可读流
。我用正确的piping.Thanx语法更新了我的答案供您更正,但根据
child\u process.exec
文档,
回调中的
stdout
缓冲区
而不是
可读流
。这是因为当子进程终止时,
exec
调用它的回调。但是
excec
函数返回带有
stdout
属性的
ChildProcess
对象,该属性是
可读流
。我用正确的管道语法更新了我的答案。