我有node.js应用程序/模块正常工作与插件概念,即
我的模块就像代理一样,具有其他功能,例如添加新功能到开箱即用的功能(方法)。 为此,您需要执行以下操作:
克隆我的应用程序
创建一个名为extenders的新文件夹(在我的app中)
在此文件夹中,您应该提供两个文件
- extend.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.如果节点中有其他解决方案,请告诉我。
答案 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-server,webpack-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);