Nodejs 使用 pm2 的 api 启动新的 express 应用,如何获取这个 express 使用的端口?

Nodejs 使用 pm2 的 api 启动新的 express 应用,如何获取这个 express 使用的端口?

问题如上,重要的代码如下:

--------------------app.js----------------------

var pm2 = require("pm2") var process = require("process")

process.on('message', function (packet) { console.log("---------packet-------------:\n", packet); });

pm2.connect(function (err) { if (err) { console.error(err); process.exit(2); }

pm2.start({
    script: './config-service/config.js' // config.js 是一个 express 的 api       
}, function (err, apps) {
    pm2.list(function (err, list) {
        for (let i = 0; i < list.length; i++) {
            console.log("list[i].name:", list[i].name);
            if (list[i].name == "saas-config") {
                pm2.sendDataToProcessId(list[i].pm2_env.pm_id, {
                        type: 'process:msg',
                        data: {
                            msg: 'hello from pm2'
                        },
                        topic: "pm2 message"
                },
                function (err, res) {
                    console.log(err);
                });
            break;
        }
    }
    pm2.disconnect();
});

if (err) throw err

});

});

--------------------config-service/config.js---------------------------

var express = require('express') var process = require("process") app = express()

app.use(function (err, req, res, next) { console.log(' express app error:', err) res.status(500).send({ error: 'something blew up' }); });

var server = app.listen(0);//选择一个随机端口 server.on('listening', function () { var port = server.address().port console.log('**** [ service ] **** \nListening on port %d', port) //console.log("process.send:",process.send); process.send({ type: 'process:msg', data: { listenPort: port } });

})

process.on('message', function(packet) { console.log("message in config.js :\npacket:",packet); });

启动 app.js 后,能在控制台看到: PM2 | Starting execution sequence in -fork mode- for app name:config id:0 PM2 | App name:config id:0 online 0|saas-con | **** [ service ] **** 0|saas-con | Listening on port 30960 0|saas-con | message in config.js : 0|saas-con | packet: { type: 'process:msg', 0|saas-con | data: { msg: 'hello from pm2' }, 0|saas-con | topic: 'pm2 message', 0|saas-con | id: 0 }

我的想法是, config api 启动之后, 发一个消息给 pm2 , 其中包含其使用的端口, 然后 pm2 收到消息之后,再启动其他的一些服务,带上这个 config api 的端口号。

但目前的情况是, pm2 发出的消息, config 中能打印出来,但在 pm2 中收不到在 config 中发出的消息。 请教一下大家,这样的需求能否做到? 或者我的代码哪里有问题, 拜谢


1 回复

在 Node.js 中使用 pm2 的 API 启动一个新的 Express 应用,并获取这个 Express 应用所使用的端口,你可以按照以下步骤操作:

  1. 启动 Express 应用并通过 pm2 管理: 首先,你需要确保你的 Express 应用在启动时可以输出或暴露其使用的端口。通常,这可以在 server.jsapp.js 文件中设置。

  2. 使用 pm2 启动应用并获取配置: 你可以使用 pm2 的脚本配置功能来设置端口,并在启动后获取该配置。

以下是一个示例代码,展示如何使用 pm2 的 API 来启动 Express 应用并获取端口:

const pm2 = require('pm2');
const path = require('path');

// 配置 pm2 脚本
const scriptConfig = {
  script: path.resolve(__dirname, 'app.js'), // 指向你的 Express 应用入口文件
  instances: 1,
  exec_mode: 'cluster',
  env: {
    NODE_ENV: 'development',
    PORT: 3000 // 设置默认端口,也可以在 app.js 中动态获取
  },
  env_production: {
    NODE_ENV: 'production',
    PORT: process.env.PORT || 8080
  }
};

// 启动脚本
pm2.start(scriptConfig, (err, apps) => {
  if (err) throw err;
  console.log(`App started on port: ${scriptConfig.env.PORT}`);
});

在这个例子中,scriptConfig.env.PORT 设置了应用的端口。你可以在 app.js 中通过 process.env.PORT 获取这个端口号。确保你的 Express 应用监听这个端口。

注意:实际使用时,你可能需要根据你的项目结构和需求调整路径和配置。

回到顶部