楼主最近在用 Express 4.2.0 写一个项目,项目中有一个这样的需求:
用户可以自定义后台控制面板的地址。比如说,初始化的后台地址是
http://example.com/admin 。用户在后台中可以修改成
http://example.com/newadmin 。修改提交完成之后自动跳转到新的后台地址。访问原来的地址会提示无法访问。
我自己的思路是这样的,先在项目中新建一个 config.js 文件,把初始化数据存进去,初始化的后台地址为 /admin 。然后用户登录后台控制面板之后,可以提交新的后台地址,把这个新的后台地址存在数据库中。
在项目的路由控制中,我是这样写的:
var setting = require('../setting');
var config = require('../config');
setting.getSetting(function (err, s) {
//判断数据库中是否有 admin_path 这个值,如果有的话将 app.locals.adminPath 赋值为其值,否则
//赋值为 config 文件中的初始值。
app.locals.adminPath = (s && s.admin_path) ? s.admin_path : config.admin_path;
app.use(app.locals.adminPath, Router);
});
我这个思路从表面上看没什么问题,但是实际上行不通。实际的效果是,除非重新启动该项目,否则存储在数据库中的路径发挥不了作用。
我稍微分析了一下原因,发现是因为当运行该 Express 项目时,app.use(app.locals.adminPath, Router) 这个命令只会运行一次。而不是一次请求运行一次。所以就算修改 app.locals.adminPath 的值也没用了。
我试着在用户提交新的后台地址之后,把新的后台地址赋值给 app.locals.adminPath ,然后重新执行一次 app.use(app.locals.adminPath, Router) ,以为会覆盖之前的路径处理,但是结果不然。重新绑定路由已经没效果了。
现在我的方案是使用 supervisor 运行该项目,然后当用户成功存储后台地址到数据库的时候强制结束该项目进程。然后 supervisor 自动将其重启。这是一种比较笨的方法。
想问问各位大神,有没有更好的解决办法?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/123038
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.