我可以在子进程中定义Express路由吗?

时间:2013-11-26 11:36:48

标签: node.js express child-process

所以我运行了一堆用node编写的聊天机器人,没什么太令人兴奋的。但是,我最近决定给他们自己的小网页以图形方式显示信息。要做到这一点,我想我只是跑快递。

但是,我正在使用包装文件运行我的机器人,该文件将每个聊天机器人作为子进程启动。这使得使用表达有点棘手。目前我正在wrapper.js文件中启动快速服务器,如下所示:

var express = require("express");  
var web = express();  
web.listen(3001);

然后在子进程中,我正在这样做:

var express = require("express");
var web = express();
web.get("/urlforbot",function (req,res) {
   res.send("Working!"); 
});

但是,当我导航到:3001/urlforbot时,我会Cannot GET /urlforbot

知道我做错了什么以及如何解决这个问题?

修改:这是我完整的包装文件:http://snippi.com/s/3vn56m2

编辑2 :这就是我现在正在做的事情。我将每个机器人托管在它自己的端口上,并将这些信息存储在配置中。这是我正在使用的代码,它似乎正在运行:

web.get("/"+cfg.route, function (req,res) { // forward the data
   res.redirect('http://url.com:'+cfg.port+"/"+cfg.route);
});

1 个答案:

答案 0 :(得分:1)

由于您的机器人作为单独的进程运行(任何特殊原因?),您必须将每个机器人视为必须使用Express实现自己的HTTP服务器:

var express = require("express");
var web = express();
web.get("/urlforbot",function (req,res) {
   res.send("Working!"); 
});
web.listen(UNIQUE_PORT_NUMBER);

每个bot进程都需要侦听一个唯一的端口号,它不能被共享。

接下来,您需要将“master”进程中端口3001上的请求映射到正确的子进程'Express服务器。

node-http-proxy有一个名为ProxyTable的有用选项,用于创建此类映射,但它需要主进程知道每个端点(您的术语中为/urlforbot)机器人是。它还要求主机知道机器人正在监听哪个端口。

编辑:或者,您可以使用child_process.fork为每个机器人分叉一个新进程,并在它们和主进程之间进行通信(端口号等等,甚至全部使用Node提供的comm通道生成/urlforbot页面所需的数据,但这仍然听起来像是一个过于复杂的设置。

是不是可以改为创建Bot课程?您将为要运行的每个bot实例化该类,该实例将加载其特定配置并将其路由添加到Express服务器。全部来自同一个过程。