2016-04-25 19 views
9

Sto avendo l'applicazione/modulo node.js che è funzionante OK con il concetto di plug-in, ad es.Come aggiungere plugin e utilizzare qualche modulo/file esterno su RT

Il mio modulo agisce come proxy con funzionalità aggiuntive come aggiungendo la nuova funzionalità alle funzionalità (metodi) predefinite. Per fare questo è necessario effettuare le seguenti operazioni:

clone mia domanda

creare una nuova cartella che si chiama estensori (dentro la mia app)

In questa cartella è necessario fornire due file

  1. extend.js con la logica di come funzioni/metodi
  2. 012.
  3. extend.json che definiscono la vostra API (per sapere quale file da richiamare)

Nota: il JS & JSON nome del file deve essere identico

per esempio lascia supporre che questo è il file extend.json

{ 
    "extenders": [ 
    { 
     "path": "run", 
     "fn": "runFn" 
     }, 
} 

in questo caso quando l'utente ha messo nel browser il seguente link

localhost: 3000/run

Im invocando la runFn funzione di (che esiste nel file extend.js) con la sua logica e questo è lavorare come previsto (sotto il cofano ho letto la json & js file e richiamare la funzione come extender[fnName](req, res));

Ora Voglio sostenere il caso d'uso di aggiungere estensore esterno tramite codice per esempio, che l'utente dovrà fare qualcosa di simile

var myModule = require('myModule'); 

myModule.extend('./pathTo/newExternalPathforExtendersFolder'); 

così quando il mio modulo sarà eseguirlo tempo cerca c'è nuovi estensori esterni esistono con tutte le configurazioni e, in tal caso, fare riferimento ad esso in RT (ai file js & json).

Le mie domande sono:

  1. Ho bisogno di trovare quando il mio modulo è partire che è registrati per il mio modulo e poi fare la mia logica su questo modulo, come può essere fatto in nodo?

2.se nel nodo ci sono altre soluzioni, fatemelo sapere.

+0

Non è chiaro cosa stai chiedendo. La tua app è un'applicazione esplicita? Permette all'utente di definire percorsi in file separati? Che cosa stai chiedendo è diverso da ciò che è già implementato, ad eccezione della possibilità di aggiungere altre cartelle? –

+0

Puoi mostrare il codice? –

risposta

0

Credo che un semplice router dovrebbe soddisfare le vostre esigenze:

var userModule = require('userModule'); 

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

}).all(yourReverseProxy); 
+0

Grazie, ma per quanto ho capito, questo non sarà d'aiuto dato che il mio reverse proxy è un modulo che contiene percorsi ... inoltre ho bisogno di invocare qualche metodo nell'userModule come dovrei farlo? puoi fornire un codice di lavoro completo come esempio che posso utilizzare per testare? grazie ancora :) –

+0

Provo qualcosa come hai detto ma non funziona :(, ma forse mi manca qualcosa, grazie comunque. –

1

Si potrebbe implementare la funzione di inizio nella vostra api per dare la libertà al modulo utenti. Per esempio.

var yourModule = require('yourModule').init({ 
    extenders: [ 
    { 
     "path": "run", 
     "fn": "runFn" 
    } 
    ] 
}); 

yourModule.listen(3000); 

O come scritto da MattW è possibile implementarlo come un middleware espresso, in modo che gli utenti del modulo possano utilizzarlo con il proprio server. Per esempio:

var yourModule = require('yourModule').init({ 
    extenders: [ 
    { 
     "path": "run", 
     "fn": "runFn" 
    } 
    ] 
}); 

app = require('express')(); 
app.use(yourModule.getMiddleware()); 

Guardate webpack-dev-server, webpack-dev-middleware come un altro esempio. Spero ci sia qualche somiglianza con il tuo compito. Webpack si occupa anche di fs e configs. Hanno appena diviso il middleware e il server standalone per separare i moduli. E non c'è "codice di lavoro", perché abbiamo bisogno del codice del tuo modulo, per parlare di wrapper, che dipenderebbe dall'implementazione del tuo modulo. Solo alcuni pensieri.

1

Se non sbaglio capisco il tuo problema, forse questo approccio può aiutarti.

Penso che potresti elencare gli estensori in un ACL come JSON che non include solo il percorso o il nome fn, ma il percorso file_to_js o qualsiasi altra proprietà di cui hai bisogno, come se fosse attiva o parametri di sicurezza.

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

Quindi è possibile precaricare i moduli leggendo ACL json e lasciare che siano memorizzati nella cache pronti per l'estensione.

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; 

Quindi Router.init() dovrebbe eseguire il lavoro di cache sul server init; Router.extend() dovrebbe risolvere la tua richiesta API o estenderne una in fase di elaborazione.

Spero che ti aiuti!