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

How to add plugin and using some external module/file on RT

本文关键字:外部 模块 文件 RT 插件 添加      更新时间:2023-09-26

我有节点.js应用程序/模块,它与插件概念一起工作正常,即

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

克隆我的应用程序

创建新文件夹,称为扩展器(在我的应用程序内)

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

  1. 扩展.js将您的逻辑作为函数/方法
  2. extend.json,定义你的API(知道要调用哪个文件)

注意: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.如果节点中有其他解决方案,请告诉我。

您可以在 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-server,webpack-dev-middleware 作为另一个例子。希望与您的任务有一些相似之处。Webpack 还处理 fs 和配置。他们只是将中间件和独立服务器拆分为单独的模块。而且没有"工作代码",因为我们需要你的模块的代码来谈论包装器,这将取决于你的Module实现。只是一些想法。

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

我认为您可以在像 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 请求或扩展正在处理的请求。

希望对您有所帮助!

我相信

一个简单的路由器应该可以满足您的要求:

var userModule = require('userModule');
router.use('/run', function (req, res, next) {
  return next(userModule(req));
}).all(yourReverseProxy);