如何在RT上添加插件并使用一些外部模块/文件

时间:2016-04-25 12:16:50

标签: javascript node.js express module npm

我有node.js应用程序/模块正常工作与插件概念,即

我的模块就像代理一样,具有其他功能,例如添加新功能到开箱即用的功能(方法)。 为此,您需要执行以下操作:

  

克隆我的应用程序

     

创建一个名为extenders的新文件夹(在我的app中)

在此文件夹中,您应该提供两个文件

  
      
  1. extend.js,您的逻辑为函数/方法
  2.   
  3. extend.json定义您的API(以了解要调用的文件)
  4.   

注意:JS& JSON文件名必须相同

例如,假设这是您的extend.json文件

{
  "extenders": [
    {
        "path": "run",
        "fn": "runFn"
      },
}

在这种情况下,当用户在浏览器中输入以下链接

  

本地主机:3000 /运行

我使用其逻辑调用 runFn 函数(存在于extend.js文件中),这是正常工作,因为我在阅读json& ; js文件并调用像extender[fnName](req, res));

这样的函数

现在我想支持通过代码添加外部扩展程序的用例 例如,用户将执行类似

的操作
var myModule = require('myModule');

myModule.extend('./pathTo/newExternalPathforExtendersFolder');

所以当我的模块运行它搜索天气时,会有新的外部扩展器存在所有配置,如果是这样,请在RT中引用它(到js& json文件)。

我的问题是:

  1. 我需要找到我的模块开始谁注册到我的模块然后在这个模块上做我的逻辑,如何在节点中完成?
  2. 2.如果节点中有其他解决方案,请告诉我。

3 个答案:

答案 0 :(得分:1)

您可以在api中实现初始化函数,为模块用户提供自由。例如。

var yourModule = require('yourModule').init({
  extenders: [
    {
      "path": "run",
      "fn": "runFn"
    }
  ]
});

yourModule.listen(3000);

或者正如MattW所写,你可以像快速中间件一样实现它,因此模块用户可以将它与自己的服务器一起使用。例如:

var yourModule = require('yourModule').init({
  extenders: [
    {
      "path": "run",
      "fn": "runFn"
    }
  ]
});

app = require('express')();
app.use(yourModule.getMiddleware());

请看webpack-dev-serverwebpack-dev-middleware,就像另一个例子。希望你的任务有一些相似之处。 Webpack还处理fs和配置。他们只是将中间件和独立服务器拆分为单独的模块。并且没有“工作代码”,因为我们需要你的模块代码,讨论包装器,这取决于你的模块实现。只是一些想法。

答案 1 :(得分:1)

如果我理解您的问题并没有错,也许这种方法可以帮助您。

我认为你可以在像JSON这样的ACL中列出你的扩展器,它不仅包括路径或fnName,还包括file_to_js路径或你需要的任何其他属性,比如它的活动或安全参数。

extenders: [
   {
     "path": "run",
     "fn": "runFn",
     "file": "file_path"
     "api-key": true,
     "active": true
   }
]

然后你可以预加载读取ACL json的模块,并让它们缓存以备扩展。

var Router = {
    extenders: {},
    init: function () {
        this.extenders = {};
        this.loadExtenderFiles();
    },
    loadExtenderFiles: function () {
        var key, extender;
        // Iterate extender files
        for (key in ACL_JSON) {
            // extender load logic
            extender = ACL_JSON[key];
            if (extender.active) {
                this.extenders[extender.fn] = require(extender.file);
            }
        }

    },
    // this fn should allow you to Router.extend() anywhere during the request process
    extend: function (fn, request, response) {
        // Parse request/response to match your extender module pattern
        // extender process logic
        this.extenders[fn](request, response);
    }
};
module.exports = Router;

所以Router.init()应该在服务器init上进行缓存工作; Router.extend()应解决您的api请求或扩展正在处理的请求。

希望它可以帮到你!

答案 2 :(得分:0)

我相信一个简单的路由器应该满足您的要求:

var userModule = require('userModule');

router.use('/run', function (req, res, next) {
  return next(userModule(req));

}).all(yourReverseProxy);