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

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

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

克隆我的申请

创build新的文件夹被称为扩展(在我的应用程序内)

在这个文件夹中,你应该提供两个文件

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

注意: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'); 

所以当我的模块将运行它的search天气有新的外部扩展存在与所有configuration,如果是这样在RT(引用到js和json文件)。

我的问题是:

  1. 我需要find什么时候我的模块正在启动谁注册到我的模块,然后在这个模块上做我的逻辑,如何在节点上完成?

如果节点中有其他解决scheme,请告诉我。

你可以在你的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和configs。 他们刚刚拆分中间件和独立服务器来分离模块。 并没有“工作代码”,因为我们需要你的模块的代码,谈论包装,这将取决于你的模块实现。 只是一些想法。

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

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

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

然后,您可以预读您的模块读取ACL JSON,并让他们caching准备扩展。

 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上做caching工作; Router.extend()应该解决你的API请求或扩展一个正在处理。

希望它可以帮助你!

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

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