所以我运行了一堆用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);
});
答案 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服务器。全部来自同一个过程。