2017-08-03 62 views
0

我想创建一个插件文件夹,将有各种插件。因此,例如,如果有一个名为“admin”的插件,就不会有这样就会产生adminOnly文件,看起来像这样的/插件/ admin文件夹:动态添加路线

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

我确定你知道这一点,但要注意清理输入,以便用户无法请求意外的文件(例如'../../../ etc/passwd') –

+0

我的实际想法是只允许用户访问.../plugins/nameOfPlugin/index.js,然后要求所有插件维护被命名为index.js的路由 –

回答

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); 
    } 
});