在NodeJs / ExpressJs中在运行时注册新路由

时间:2018-02-19 14:43:07

标签: node.js express dynamic-routing

我想扩展这个开放主题:Add Routes at Runtime (ExpressJs)遗憾的是,这对我没有帮助。

我正在开发一个允许创建在NodeJ上运行的不同API的应用程序。用户界面如下所示:

new rule with two endpoints (GET,POST)

正如您所看到的,这段代码包含两个端点(GET,POST),只要按“保存”,它就会创建一个位于Nodejs路径中的.js文件应用程序正在寻找其端点(例如:myProject \ dynamicRoutes \ rule_test.js)。

我遇到的问题是,在我开发代码时Nodejs服务器正在运行,我无法调用这些新的端点,除非我再次重启服务器(并且ExpressJs检测到文件)

有没有办法注册新的路线 NodeJs(ExpressJs)正在运行?

我试着做以下事情但没有运气:

app.js

如果重新启动服务器,则此方法有效。我试图包含这个库(express-dynamic-router,但不在运行时工作。)

//this is dynamic routing function
function handleDynamicRoutes(req,res,next) {    
    var path = req.path; //http://localhost:8080/api/rule_test
    //LoadModules(path)
    var controllerPath = path.replace("/api/", "./dynamicRoutes/");
    var dynamicController = require(controllerPath);
    dynamicRouter.index(dynamicController[req.method]).register(app);
    dynamicController[req.method] = function(req, res) {
       //invocation
    }

    next();
}

app.all('*', handleDynamicRoutes);

最后,我读了这篇文章(#NodeJS / #ExpressJS: Adding routes dynamically at runtime),但我无法弄清楚这对我有什么帮助。

我相信这可能是某种方式,但我觉得有点迷失。谁知道我怎么能做到这一点?每次创建文件后,我都会收到CAN NOT GET错误。

2 个答案:

答案 0 :(得分:2)

免责声明:请注意,在稳定性和安全性方面,它被认为是一种糟糕的设计,允许用户甚至管理员通过网络表单注入可执行代码。将此主题视为学术讨论,并且不要在生产中使用此代码!

看看这个在运行时添加新路径的简单示例:

app.get('/subpage', (req, res) => res.send('Hello subpage'))

所以基本上在调用app.get时注册新路由,不需要遍历路由目录。

您只需加载新创建的模块并将应用程序传递给module.exports函数即可注册新路由。我想这个单行应该可以正常工作(未经测试):

require('path/to/new/module')(app)

答案 1 :(得分:1)

req.params对你来说够了吗?

<p>Select:</p>
    <input value="blue" type="button" onclick="document.getElementById('colorChosen').innerText='blue'" />
    <input value="green" type="button" onclick="document.getElementById('colorChosen').innerText='green'" />
    <br>
    <select name="estados-mexico">
    <option value="AC">Acre</option>
    <option value="AL">Alagoas</option>
    <option value="AP">Amapá</option>
    </select>
    <div id="colorChosen"></div>
    <div id="stateChosen"></div>

因此用户可以在/ basepath之后输入任何内容,例如

app.get('/basebath/:path, (req,res) => {
  const content = require('content/' + req.params.path);
  res.send(content);
});

然后路由器会尝试获取文件内容/ bergur.js 并发送它的内容。

相关问题