【问题标题】:How to finish loading first while child process is running in node.js如何在 node.js 中运行子进程时首先完成加载
【发布时间】:2019-04-22 09:34:24
【问题描述】:

我对 node.js 很陌生。目前,当我评估http://localhost:4000/testjar 时,我运行一个子进程来执行 jar 文件。加载页面并在子进程完成运行后显示标准输出需要一些时间。

有没有办法在等待子进程运行时先完成页面的加载,然后在子进程完成运行后将响应发送给客户端。因为我不希望页面加载这么久。

现在流程是

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

有没有类似

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;

【问题讨论】:

    标签: javascript node.js express server child-process


    【解决方案1】:

    您可以为此使用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>
    

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 2020-08-08
      • 1970-01-01
      • 2021-06-02
      • 2013-07-30
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多