从node.js应用程序中运行一些node.js Web服务器

时间:2018-03-25 09:35:49

标签: node.js linux webserver

我想使用UI控制一些网站来启动和停止它们,更改不同Web服务器监听的端口。

PM2是一个管理节点站点的命令行实用程序,但没有我可以为我的客户提供的用户界面。

如何从另一个node.js Web应用程序中运行node.js网站。

以下node.js代码似乎无法正常工作。

const { exec } = require('child_process');

....

exec('node app.js', (err, stdout, stderr) => {
    if (err) {
        console.log(`err: ${err}`);
        return;
    }

    // the *entire* stdout and stderr (buffered)
    console.log(`stdout: ${stdout}`);
    console.log(`stderr: ${stderr}`);
});

注意:常规linux命令而不是'node app.js'命令按预期工作。

2 个答案:

答案 0 :(得分:2)

如果您想要运行相同的代码,请使用以下代码: 这是服务器上将生成新Web服务器的代码。

app.get('/start', ( req, res ) => {

    var node = spawn('node', ['app.js &'], { shell: true });

    node.stdout.on('data', function (data) {
      console.log('stdout: ' + data.toString());
    });

    node.stderr.on('data', function (data) {
      console.log('stderr: ' + data.toString());
    });

    node.on('exit', function (code) {
      console.log('child process exited with code ' + 
        code.toString());
    });

    // Notify client 
   res.status(200).send( {} );
});

答案 1 :(得分:1)

最简单的替代方法是保留ExpressJS实例的集合,并根据需要在NodeJS中创建/销毁它们:

#wrapper{
  height: 200px;
  width: 400px;
}

#navbar{
  background-color: yellow;
  height: 50px;
}

#main{
  background-color: blue;
  height: 200px;
}

#sidebar{
  background-color: red;
}

但是,如果你需要产生独立的进程,你可以:

const express = require("express");

var app1 = express();
app1.use("/", function(req, res){ res.send("APP 1"); });

var app2 = express();
app2.use("/", function(req, res){ res.send("APP 2"); });

// start them
var server1 = app.listen(9001);
var server2 = app.listen(9002);

// close the first one
server1.close();

// port 9001 is closed
// port 9002 is still listening

启动这样的新流程:

const { spawn } = require("child_process");

// Prevent Ctrl+C from killing the parent process before the children exit
process.on("SIGINT", () => {
  console.log("Terminating the process...");
  if (runningProcesses > 0) {
    setTimeout(() => process.exit(), 3000);
  } else {
    process.exit();
  }
});

function asyncSpawn(command, parameters = []) {
  return new Promise((resolve, reject) => {
    runningProcesses++;
    console.log(command, ...parameters, "\n");

    spawn(command, parameters, {
      stdio: "inherit"
    })
      .on("close", code => {
        if (code)
          reject(new Error(command + " process exited with code " + code));
        else resolve();
      })
      .on("exit", error => {
        runningProcesses--;
        if (error) reject(error);
        else resolve();
      });
  });
}