使用Express.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?

回答:

正如@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呢?随着每个请求进入数据库,您将能够更好地横向扩展。

以上是 使用Express.js(node.js)进行动态路由的最佳方法 的全部内容, 来源链接: utcz.com/qa/410854.html

回到顶部