2016-04-25 55 views
9

我使用node.js應用程序/模塊正常工作OK帶有插件概念,如何在RT上添加插件並使用一些外部模塊/文件

我的模塊的代理功能類似於其他功能,如將新功能添加到開箱即用功能(方法)。 要做到這一點,你需要做到以下幾點:

克隆我的應用程序

創建被稱爲擴展(我的應用程序內)新文件夾

在此文件夾,你應該提供兩個文件

  1. extend.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文件中的js &)。

我的問題是:

  1. 我需要找到當我的模塊開始誰是註冊到我的模塊,然後做我的邏輯此模塊上,如何能夠在節點完成?

2.如果節點中有其他解決方案請讓我知道。

+0

目前尚不清楚你在詢問什麼。你的應用是一個快速應用嗎?它允許用戶在單獨的文件中定義路線嗎?除了添加額外文件夾的功能之外,您要求的內容與已實施的內容不同? –

+0

你能顯示代碼嗎? –

回答

0

我相信一個簡單的路由器應該滿足你的要求:

var userModule = require('userModule'); 

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

}).all(yourReverseProxy); 
+0

謝謝,但據我所知這不會幫助,因爲我的反向代理是一個模塊,其中包含路由...此外,我需要調用userModule中的一些方法,我應該怎麼做?你能否提供一份完整的工作代碼作爲我可以用來測試的樣本?再次感謝:) –

+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和configs。他們只是分割中間件和獨立服務器來分離模塊。而且沒有「工作代碼」,因爲我們需要你的模塊的代碼,來討論包裝器,這將取決於你的模塊實現。只是一些想法。

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請求或擴展正在處理的請求。

希望它可以幫助你!

相關問題