【问题标题】:NodeJS/Express - live stream stdout of child_process.spawn to clientNodeJS/Express - child_process.spawn 的实时流标准输出到客户端
【发布时间】:2017-08-18 19:34:11
【问题描述】:

我有一个使用 express 的小型 Node 应用程序,它最初显示一个表单,获取一些值和文件,并将它们提供给 ELF 可执行文件。我已经能够使用 child_process.spawn 捕获其标准输出,但我无法将其实时发送给客户端。

标准输出最终会显示在客户端上,但仅在调用 res.end() 时才会显示。有没有办法在客户端显示算法生成的输出?

这是服务器代码(表单是基本表单,标准输出应呈现为空白网页):

// builtin libraries
var spawn = require('child_process').spawn;
var exec = require('child_process').exec;

// external libraries
var express = require('express');
var multer = require('multer');
var bodyParser = require('body-parser');
var S = require('string');

// create upload directory if it doesn't exist
var dir_upload = "/tmp/algorithm/files/"
exec("mkdir -p " + dir_upload, {}, function (err, stdout, stderr) {
 if (err) throw err;
});

app.use(express.static('public'));

// parse text fields
app.use(bodyParser.urlencoded({ extended: false }));

// parse files
app.use(multer({ dest : dir_upload }).fields([{name: 'out'}, {name: 'label'}, {name: 'minor'}]));

// display form
app.get('/', function (req, res) {
  res.sendFile(__dirname + '/form.html');
})

app.post('/', function (req, res) {

  res.writeHead(200, {'Content-Type': 'text/plain', 'Transfer-Encoding': 'chunked'});

  // add parameters to array
  var args = [];
  var vopt = false;
  var vstr = "";
  var keys = Object.keys(req.body), len = keys.length, i = 0;
  while (i < len) {
      // basic argument parsing - not shown here
  }

  // get input file paths
  args.push(req.files.out[0].path);
  args.push(req.files.label[0].path);
  if (req.files.minor) args.push(req.files.minor[0].path);

  // run algorithm
  var command = __dirname + "/../algorithm_dir/src/algorithm";

  // provide env mainly for AWS CentOS environments with old GCC versions
  var algorithm = spawn(command, args, { shell: true, env: { 'LD_LIBRARY_PATH': '/usr/local/lib:/usr/lib:/usr/local/lib64:/usr/lib64' }});
  var output = "";

  algorithm.stdout.on('data', function (data) {
    res.write(data.toString());
  });

  algorithm.on('close', function () {
    res.end("\n----------DONE----------");

    // remove input files
    exec("rm -rf " + req.files.out[0].path + " " + req.files.label[0].path + " " + req.files.minor[0].path,
         {}, function (err, stdout, stderr) {
      if (err) throw err;
    });
  });
})

// listen on port 8080
var server = app.listen(8080, function () {
  var host = server.address().address
  var port = server.address().port
})

【问题讨论】:

    标签: node.js express stdout


    【解决方案1】:

    尝试设置header not write然后,如:

    res.setHeader("content-type", "some/type");
    

    然后像你一样写入数据并关闭

    【讨论】:

    • 我很难理解您的答案以及它为什么会有所帮助。你能澄清一下吗?
    猜你喜欢
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多