2014-01-03 3 views
0

Итак, я запускаю несколько чат-ботов через child.fork(../bots/config1.js) и так далее. Я хочу сделать веб-интерфейс для указанных ботов чата, чтобы отобразить некоторые данные. Поскольку они являются дочерними процессами, они не могут получить доступ к одному и тому же порту. Сейчас я делаю переадресацию, когда я запускаю бота. Например, в моем запуске файла, это выглядит примерно так: Получить маршруты через сообщение

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 для обработки этого запроса. Но он чувствует себя липким.

Это маршрут в файле бота:

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

Вы можете отправлять сообщения между процессами fork и родительским процессом. Пример и документы: http://nodejs.org/api/child_process.html#child_process_child_send_message_sendhandle – damphat

+0

Я знаю, что я уже делаю так, что бот может перезагрузиться. Он отправляет сообщение обертке, и обертка убивает процесс и перезагружает его. Но как я могу отправить данные INSIDE по маршруту, а затем получить данные из ('message') для рендеринга? –

ответ

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 
+0

Хорошо, это похоже на то, что мне нужно, я попробую это в нескольких. Однако будет ли «некогда» вмешиваться в обработку сообщений, которые у меня уже есть? Потому что бот отправляет сообщение, когда ему нужно перезагрузить себя. Я все равно попробую, но мне нравится, когда меня успокаивают: P –

Смежные вопросы