2017-08-03 110 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); 
    } 
});