我有节点.js应用程序/模块,它与插件概念一起工作正常,即
我的模块就像代理一样具有附加功能,例如向开箱即用的功能(方法)添加新功能。为此,您需要执行以下操作:
克隆我的应用程序
创建新文件夹,称为扩展器(在我的应用程序内)
在此文件夹中,您应该提供两个文件
- 扩展.js将您的逻辑作为函数/方法
- 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 文件)。
我的问题是:
- 我需要找到我的模块何时启动时谁注册到我的模块,然后在这个模块上做我的逻辑,如何在节点中完成?
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);