动态添加路由

时间:2017-08-03 22:18:36

标签: javascript node.js

我正在尝试创建一个包含各种插件的插件文件夹。因此,例如,如果有一个名为" admin"的插件,则会有一个/ plugins / admin文件夹,其中有一个adminOnly文件,如下所示:

router.get('/', (req, res, next) => {...})
router.get('/link1', (req, res, next) => {...})
router.post('/link2', (req, res, next) => {...})
router.get('/link3', (req, res, next) => {...})
.
.
.

以前,在我的app.js文件中,我有类似的内容:

const adminOnly = require('.../plugins/admin/adminOnly'
...  
app.use('/adminOnly', adminOnly)

如果我访问www.website.com/adminOnly/link1,我会得到router.get中的链接1。

但是,我想让它全部动态,以便我可以更改我的app.js逻辑,以便它是这样的:

app.use((req, res, next) => {
  const possiblePlugin = require('.../plugins/${req.baseUrl}')
  res.render<or something> (possiblePath)
}

我的想法是尝试前往前端请求的路径,看看有什么,但要在运行时动态添加路径,这样任何人都可以随时添加插件。

1 个答案:

答案 0 :(得分:0)

为每条路线创建一个文件夹。所以你的文件系统是这样的:

/plugins
-><name of plugin>/
---->index.js
---->otherFilesNeededForThisPlugin.js

其次,一旦有人请求路由,而不是搜索路由,在启动服务器时添加所有路由更有意义。因此,您可以读取/ plugins中的所有文件夹,然后为每个文件夹添加index.js文件。像这样:

// adds all plugins. Plugins should be in the 'plugins' folder
// and the route should be named 'index.js'
fs.readdirSync(join(__dirname, 'plugins')).forEach((fileOrFolder) => {
  const fullFilePath = join(__dirname, 'plugins', fileOrFolder);
  if (fs.lstatSync(fullFilePath).isDirectory() && fs.existsSync(`${fullFilePath}/index.js`)) {
    const pluginName = `/${fileOrFolder}`;
    const pluginModule = require(fullFilePath); // eslint-disable-line
    app.use(pluginName, pluginModule);
  }
});