我们正在尝试开发一个可插拔的应用程序,其中NodeJS和Express支持MySQL。我们正在尝试实现一个可插入的框架,其中将有一个包含自定义模块的/plugins
文件夹。模块将require()
基于哪个模块处于活动状态。插件的活动/非活动状态是数据库中的简单标志。
需要的问题/建议
如果文件夹的名称存储在一个平面数组中,然后迭代并且需要,则正确加载模块。虽然如果在MySQL Query语句之类的异步调用中完成相同操作,模块会显示为已加载,但模块中的路由不起作用。以下是代码示例
文件夹结构
./source
-node_modules/
-plugins/
--moduleA/
---index.js
---routes/
---views/
--moduleB/
---index.js
---routes/
---views/
-public/
-routes/
-views/
app.js
工作代码
以下代码完美地需要模块,路由/视图等正在运行。
var plugins = ['moduleA', 'moduleB']
plugins.forEach(function(p) {
require('./plugins/' + p)(app)
})
代码无效
这就是我真正想要的,但它没有按预期工作。以下方法显示模块已加载,但模块中声明的路径不起作用。
connection.query("SELECT * FROM plugins WHERE active = 1", function(err, plugins) {
if (err) {
console.log(err)
} else {
console.log(plugins)
/* plugins = [ { id: 1, plugin_name: 'moduleA', active: 1 }, { id: 2, plugin_name: 'moduleB', active: 1 } ] */
plugins.forEach(function(p) {
require('./plugins/' + p.plugin_name)(app)
})
}
})
模块代码
以下是moduleA/index.js
中代码的外观
module.exports = function(app) {
console.log('ModuleA Loaded')
var lead = require('./routes/view');
app.use('/moduleA', lead);
};