2017-08-18 9 views
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 
}) 

答えて

1

と同じように、その後の書き込みではないヘッダを設定しよう:

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

次にデータを&に書き込んでください

+0

私はあなたの答えを理解することができず、なぜ役立つのですか?明確にしていただけますか? – trashcan86

関連する問題