最好的办法与Express.js(node.js的)动态路由(Best way to do dyna

2019-07-21 08:37发布

我试图创建一个简单的CMS与动态创建的路线express.js。 它从看起来像这样一个数据库中的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]);
    });
});

现在,一切工作正常。 但问题是,每一个用户修改的内容和路径,整个节点的应用程序需要重新启动的时间。 我didin't发现任何API调用来删除路由。

有什么办法安全地删除与app.get设定的老路线? 应我甚至做到这一点?

有没有更好的办法做这样的路由? 我不喜欢这种方法,因为它允许我使用内置的功能,速度快,支持正则表达式。

我试图消除与app.routes = NUL整个app.routes但它没有做任何事情,老路线仍然到位。

有一两件事,确实删除了

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

但是,这实际上是删除它们,是可以安全使用的,所以我不结束劫持RAM的海量如果路由器不断得到重新填充?

Answer 1:

作为@supermova在评论中说,这是可以对即时更新快。 另一个要考虑的体系结构是一个类似于经典的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),但会有与即时修改快递路线的做法头痛。 例如,规模,如果你有什么两台Web服务器? 你如何保持同步,如果服务器A获取“创建页面的要求,因此它知道要更新其路线,但对于服务器B? 每个请求去数据库,您将能够扩展水平更好。



Answer 2:

我会很小心,试图创建或运行时破坏路线。 虽然你可以自己更改这些数据结构,我不相信这些被记录为API的,所以如果/当你升级快,你的风险这个破。

如果你创建的每个数据库对象,因为该组页面可以长到谁知道有多大了新的途径,这也可以作为存储器限制。

看它像这样...你不希望新航线; 要网址添加到现有的路线。 如果要添加的路由,这意味着你需要一些URL映射到一些独特的功能。 但要映射每个URL相同的功能。 从本质上讲,你只添加的副作用路线。 您关心的是一些动态设定的URL映射到一个特定的功能。

您可以改为使用通配符的URL模式映射到特定功能,如

app.get('/pages/*', function(req, res) {
    var page = pagesfromdb[key];
    if (page != null) {
        res.render(page.render, page.language)
    }
    else {
        res.send(404);
    }
});

和管理表示层的外面pagesfromdb映射。 您可以使用直接访问数据库,缓存+数据库访问或基于时间的复习,无论你表现最好。



Answer 3:

添加路由可以在飞行中完成,如提及。 删除也可以,给这个功用:

function deleteRoute(url) {
  for (var i = app.routes.get.length - 1; i >= 0; i--) {
    if (app.routes.get[i].path === "/" + url) {
      app.routes.get.splice(i, 1);
    }
  }
}

(从被盗在运行时的Node.js卸下specfic映射路径移除静态映射? )

这样的更新路线确实让你的应用程序“状态”,并可能导致一个问题,如果你需要的负载均衡。



文章来源: Best way to do dynamic routing with Express.js (node.js)