我试图创建一个简单的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的海量如果路由器不断得到重新填充?
作为@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? 每个请求去数据库,您将能够扩展水平更好。
我会很小心,试图创建或运行时破坏路线。 虽然你可以自己更改这些数据结构,我不相信这些被记录为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映射。 您可以使用直接访问数据库,缓存+数据库访问或基于时间的复习,无论你表现最好。
添加路由可以在飞行中完成,如提及。 删除也可以,给这个功用:
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映射路径移除静态映射? )
这样的更新路线确实让你的应用程序“状态”,并可能导致一个问题,如果你需要的负载均衡。