Как сначала завершить загрузку, пока дочерний процесс выполняется в node.js - PullRequest
0 голосов
/ 22 апреля 2019

Я новичок в node.js.В настоящее время я запускаю дочерний процесс для выполнения файла JAR при оценке http://localhost:4000/testjar.После загрузки дочернего процесса потребуется время, чтобы загрузить страницу и отобразить стандартный вывод.

В любом случае я могу сначала завершить загрузку страницы в ожидании запуска дочернего процесса, а затем отправить ответ клиенту после завершения дочернего процесса.Потому что я не хочу, чтобы страница загружалась так долго.

теперь процесс

    browser loading -> start child process -> wait child process 
-> child process finish ->server send response -> browser finish loading

есть ли в любом случае make like

browser loading -> start child process -> browser finish loading and display pending for output 
-> wait child process -> child process finish ->server send response

Это мой testjar.js

var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {      
    var exec = require('child_process').exec, child;

    child = exec('java -jar /home/java/testinput.jar',
        function (error, stdout, stderr){
            console.log('stdout: ' + stdout);
            console.log('stderr: ' + stderr);
            res.send(stdout);

            if(error !== null){
                console.log('exec error: ' + error);
            }
    });
});

module.exports = router;

1 Ответ

0 голосов
/ 22 апреля 2019

Для этого можно использовать socket.io :

npm install --save socket.io

app.js:

const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);

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

function startProcess(callback) {
    setTimeout(function() {
        callback("I am done!");
    }, 3000);
    /*
    var exec = require('child_process').exec, child;
    child = exec('java -jar /home/java/testinput.jar',
        function (error, stdout, stderr) {
            console.log('stdout: ' + stdout);
            console.log('stderr: ' + stderr);
            callback(stdout);
            if (error !== null) {
                console.log('exec error: ' + error);
            }
        }
    );
    */
}

app.get('/start_process', function(req, res){
    console.log("got start_process request from socketId = " + req.query.socketId);
    io.to(req.query.socketId).emit('message', "process started");
    startProcess(function(message) {
        console.log('process finished, send message');
        io.to(req.query.socketId).emit('message', message);
    });  
    res.send('OK');
});

io.on('connection', function(socket){
    console.log('socket.io connected');
    socket.on('disconnect', function(){
        console.log('socket.io disconnected');
    });
});

server.listen(3000, function() {
    console.log('listening on *:3000');
});

public/index.html:

<!doctype html>
<html>
  <head>
    <title>Socket.IO Demo</title>
  </head>
  <body>
    <button id="startButton">start process</button>
    <div id="response"></div>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io();
        socket.on('message', function(message){
            console.log('process finished: ', message);
            document.getElementById("response").innerHTML = message;
        });
        document.getElementById("startButton").addEventListener("click", function(event) {
            var req = new XMLHttpRequest();
            req.onload = function() {
                console.log(req.response)
            };
            req.open("GET", "/start_process?socketId=" + socket.id);
            req.send();
        });
    </script>
  </body>
</html>
...