通过消息传递获取路由

时间:2014-01-03 14:43:54

标签: node.js express child-process

所以我通过child.fork(../bots/config1.js)运行几个聊天机器人等等。我想为所述聊天机器人创建一个Web界面来显示一些数据。由于它们是子进程,因此无法访问同一端口。现在,当我启动机器人时,我正在进行重定向。例如,在我的启动文件中,它看起来像这样:

var child = require('child_process');
var express = require('express');
var web = express();
var basehref = 'http://bot.example.com';

var configs = {
  'bot1':{ port:3001,file:'bot1.js',route:'bot1' },
  'bot2':{ port:3001,file:'bot2.js',route:'bot2' }
}

for (var bot in config) {
   var cfg = config[bot];

   child.fork('bots/'+cfg.file);

   web.get('/'+cfg.route,function(req,res){
     res.redirect(basehref+':'+cfg.port+'/'+cfg.route);
   });
}

我让机器人在cfg.port上启动自己的快速服务器来处理该请求。但它感觉很俗气。

这是bot文件中的路径:

web.get('/'+cfg.route,function(req,res){
  var data = { cfg:cfg,local:local,users:users,modules:{} };
  for (var i=0;i < loadedModules.length;i++){
    var module = loadedModules[i];
    data.modules[module.type] = { 
      settings:module.settings,
      toggles:moduletoggles 
    }
  }
  res.render('views/routeIndex',data);
});

所以我想知道是否有任何方法可以将数据发送到子进程,然后将数据返回到包装器并在那里创建页面,将所有机器人保留在同一端口上。

我已经尝试过使用群集,但是僵尸文件中的路由很复杂,因此在僵尸程序完全投入运行之前无法定义,我在放弃之前花了几个小时尝试。

1 个答案:

答案 0 :(得分:1)

示例:

文件bot1.js

// this bot echo the message it received
process.on('message', function (message) {
    process.send('Bot says:' + message.toUpperCase());
})

文件app.js

var child = require('child_process'), express = require('express');
var app = express();
var bot1 = child.fork('bot1.js');

app.get('/bot1/:message', function (req, res) {
    bot1.send(req.param('message'));
    bot1.once('message', function (reply) {
        res.end(reply);
    })
})

app.listen(3000);

执行命令

npm install express
node app.js

在浏览器或卷曲上:

http://domain:3000/bot1/hello%20how%20are%20you

Bot says:HELLO HOW ARE YOU