Nodejs - 将输出流输出到浏览器

时间:2010-10-14 12:18:14

标签: node.js

var http = require("http");
var sys = require('sys')
var filename = process.ARGV[2];
var exec = require('child_process').exec;
var com = exec('uptime');


http.createServer(function(req,res){
  res.writeHead(200,{"Content-Type": "text/plain"});
  com.on("output", function (data) {
    res.write(data, encoding='utf8');
  });  
}).listen(8000);
sys.puts('Node server running')

如何将数据流式传输到浏览器?

1 个答案:

答案 0 :(得分:11)

如果你一般都在问什么是错的,那么主要有两件事:

  1. 您错误地使用了child_process.exec()
  2. 您从未致电res.end()
  3. 你正在寻找的是更像这样的东西:

    var http = require("http");
    var exec = require('child_process').exec;
    
    http.createServer(function(req, res) {
      exec('uptime', function(err, stdout, stderr) {
        if (err) {
          res.writeHead(500, {"Content-Type": "text/plain"});
          res.end(stderr);
        }
        else {
          res.writeHead(200,{"Content-Type": "text/plain"});
          res.end(stdout);
        }
      });
    }).listen(8000);
    console.log('Node server running');
    

    请注意,在通常使用该字的意义上,这实际上不需要“流式传输”。如果你有一个长时间运行的进程,这样你就不想在内存中缓冲stdout直到它完成(或者你正在向浏览器发送文件等),那么你会想要'流'输出。您可以使用child_process.spawn来启动进程,立即编写HTTP头,然后每当在stdout上触发'data'事件时,您就会立即将数据写入HTTP流。在“退出”事件中,您将在流上调用end来终止它。