NodeJS,MySQL,Express - 可插拔模块

时间:2017-12-31 13:33:06

标签: mysql node.js express

我们正在尝试开发一个可插拔的应用程序,其中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);
};

0 个答案:

没有答案