我想扩展这个开放主题:Add Routes at Runtime (ExpressJs)遗憾的是,这对我没有帮助。
我正在开发一个允许创建在NodeJ上运行的不同API的应用程序。用户界面如下所示:
正如您所看到的,这段代码包含两个端点(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错误。
答案 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 并发送它的内容。