所以我通过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);
});
所以我想知道是否有任何方法可以将数据发送到子进程,然后将数据返回到包装器并在那里创建页面,将所有机器人保留在同一端口上。
我已经尝试过使用群集,但是僵尸文件中的路由很复杂,因此在僵尸程序完全投入运行之前无法定义,我在放弃之前花了几个小时尝试。
答案 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