小编典典

使用Express.js(node.js)进行动态路由的最佳方法

node.js

我正在尝试使用express.js创建一个简单的CMS,以动态创建路由。它从数据库中获取一个JSON,如下所示:

pagesfromdb = {
    home = {
        paths = ['/','/home','/koti'],
        render = 'home.ejs',
        fi_FI = {html='<h1>Hei maailma!</h1>'},
        en_US = {html='<h1>Hello World!</h1>'}
    },
    about = {
        paths = ['/about','/tietoja'],
        render = 'general.ejs',
        fi_FI = {html='Tietoja'},
        en_US = {html='About Us'}
    }
}

并遍历对象以创建路由,如下所示:

Object.keys(pagesfromdb).forEach(function(key) {
    var page = pagesfromdb[key];
    app.get(page.global.paths,function(req, res){
         res.render(page.render, page[language]);
    });
});

现在一切正常。但是问题在于,每次用户修改内容和路径时,都需要重新启动整个节点应用程序。我没有找到任何API调用来删除路由。

有什么方法可以安全地删除通过app.get设置的旧路由吗?我应该这样做吗?

有没有更好的方法来进行这种路由?我喜欢这种方法,因为它允许我使用内置函数,速度很快并且支持正则表达式。

我尝试使用app.routes = nul删除整个app.routes,但是它什么也没做,旧路由仍然存在。

确实删除了它们的一件事是

delete app._router.map.get;
app._router.map.get = [];

但这是否确实将它们移除了,并且使用起来安全吗?如果路由器不断被填充,我不会最终劫持大量的ram?


阅读 482

收藏
2020-07-07

共1个答案

小编典典

正如@supermova在评论中所说,可以实时更新Express。要考虑的另一种架构是类似于经典CMS(例如Wordpress)的架构。在其他CMS中,所有请求都转到相同的“回调”,并且在
每个请求上, 您都在数据库中查找为该URL服务的页面。

app.get('/*', function (req, res) {
   db.findPage({ slug: req.url}, function (err, pageData) {
       res.render('page-template', {
           pageContent: pageData.content,
           pageTitle: pageData.title
       });
   });
});

这种方法的结果是速度显着下降,但最终我认为它更为理智。如果速度是一个很大的问题,则可以设置一个缓存系统(例如Varnish),但是动态修改Express路由的方法会让人头疼。例如,如果必须扩展到两个Web服务器怎么办?如果服务器A收到“创建页面”请求,因此知道如何更新其路由,如何使它们保持同步,但是服务器B呢?随着每个请求进入数据库,您将能够更好地横向扩展。

2020-07-07