2

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

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

具有两个端点的新规则(GET、POST)

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

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

有没有办法在 NodeJs (ExpressJs) 运行时注册新路由?

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

应用程序.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:在运行时动态添加路由),但我不知道这对我有什么帮助。

我相信这可能以某种方式成为可能,但我感到有点失落。任何人都知道我怎样才能做到这一点?每次创建文件后,我都会收到 CANNOT GET 错误。

4

2 回答 2

2

免责声明:请注意,允许用户甚至管理员通过 Web 表单注入可执行代码在稳定性和安全性方面被认为是糟糕的设计。将此线程视为学术讨论,请勿在生产中使用此代码!


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

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

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

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

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

于 2018-02-19T15:49:16.740 回答
1

req.params 对你来说足够了吗?

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

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

http://www.mywebsite.com/basepath/bergur

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

于 2018-02-19T17:28:42.313 回答