0
Expressを使用して初期状態でフォームを表示し、いくつかの値とファイルを取得し、それらをELF実行可能ファイルに送る小さなNodeアプリケーションがあります。 child_process.spawnを使用してstdoutをキャプチャできましたが、クライアントにライブを送信することはできません。NodeJS/Express - child_process.spawnのライブストリームへの標準出力
stdoutは最終的にクライアント上に表示されますが、res.end()が呼び出された場合にのみ表示されます。アルゴリズムによって生成された出力をクライアントに表示する方法はありますか?ここで
は、サーバコードは(フォームが基本的な形で、stdoutが空白のウェブページにレンダリングする必要があります)です。
// 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
})
私はあなたの答えを理解することができず、なぜ役立つのですか?明確にしていただけますか? – trashcan86