V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
flyingfz
V2EX  ›  Node.js

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

  •  
  •   flyingfz · 2017-03-29 20:55:31 +08:00 · 3508 次点击
    这是一个创建于 2796 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    --------------------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 中发出的消息。 请教一下大家,这样的需求能否做到? 或者我的代码哪里有问题, 拜谢

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   952 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:55 · PVG 06:55 · LAX 14:55 · JFK 17:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.