2012-10-31 13 views
77

È possibile passare argomenti quando si carica un modulo utilizzando require?Passare argomenti da richiedere (durante il caricamento del modulo)

Ho un modulo, login.js che fornisce funzionalità di accesso. Richiede una connessione al database e voglio che la stessa connessione al database sia utilizzata in tutti i miei moduli. Ora esporto una funzione login.setDatabase (...) che mi consente di specificare una connessione al database e che funziona bene. Ma preferirei passare il database e qualsiasi altro requisito quando carico il modulo.

var db = ... 
var login = require("./login.js")(db); 

io sono abbastanza nuovo con NodeJS e di solito si sviluppano utilizzando Java e Spring Framework, quindi sì ... questa è un'iniezione costruttore :) E 'possibile fare qualcosa di simile al codice che ho fornito sopra?

+0

Vorrei anche dare un'occhiata alle risposte a [questo] (http://stackoverflow.com/questions/13080771/node-js-passing-variables) domanda. Come indicato nella mia risposta, un idioma comune è passare l'oggetto 'app' ai moduli richiesti. –

+0

Invece di fare tutto questo argomento passando per db, potresti usare un'implementazione [singleton] (http://www.dofactory.com/javascript/singleton-design-pattern) e chiamare db.getInstance() dove necessario. – wulfgarpro

risposta

168

sulla base di osservazioni in this answer, faccio quello che stai cercando di fare in questo modo:

module.exports = function (app, db) { 
    var module = {}; 

    module.auth = function (req, res) { 
     // This will be available 'outside'. 
     // Authy stuff that can be used outside... 
    }; 

    // Other stuff... 
    module.pickle = function(cucumber, herbs, vinegar) { 
     // This will be available 'outside'. 
     // Pickling stuff... 
    }; 

    function jarThemPickles(pickle, jar) { 
     // This will be NOT available 'outside'. 
     // Pickling stuff... 

     return pickleJar; 
    }; 

    return module; 
}; 

mi struttura praticamente tutti i miei moduli del genere. Sembra funzionare bene per me.

+0

Bello. Non so davvero quale risposta dovrei accettare :) Questo è per me valido come l'altra risposta sopra ... grazie. –

+66

Non ha importanza per me - Sono solo contento di aver finalmente potuto parlare di sottaceti su StackOverflow. : P – floatingLomas

+2

Questo dovrebbe essere contrassegnato come la risposta corretta –

27

Sì. Nel tuo modulo login, esporta solo una singola funzione che prende come argomento il numero db. Per esempio:

module.exports = function(db) { 
    ... 
}; 
+1

Ho provato questo. In login.js 'module.exports = function (app, db) { ...} module.exports.auth = function (req, res) { ... roba di autenticazione }' Chiama la funzione "anonima" e imposta le variabili 'app' e' db', ma, nel fare ciò, la mia applicazione non troverà la funzione 'auth'. Che cosa sto facendo di sbagliato? Se rimuovo la funzione anonima, la funzione 'auth' diventa nuovamente accessibile. –

+0

Come tutto in javascript, 'exports' è un oggetto. È possibile assegnarvi delle proprietà (più esportazioni) oppure assegnarle a un valore. Sembra che tu abbia assegnato le esportazioni a una funzione, ma poi hai assegnato l'autenticazione come proprietà della funzione assegnata alle esportazioni. Quindi dovresti fare 'var auth = require (" ./ login.js "). Auth' che potrebbe non essere quello che intendi. Se si desidera utilizzare il modello della domanda originale, è probabilmente meglio attenersi a un singolo valore di esportazione. Se questo non ha ancora senso, ti consiglio di pubblicare un elenco per me da guardare. –

+1

Dopo averlo letto di nuovo, sembra che tu abbia assegnato 'auth' come proprietà dell'oggetto' exports', e successivamente nel modulo hai assegnato 'exports' a una funzione (annullando quindi il compito precedente). Se inverti l'ordine del compito dovresti essere in grado di accedere alla funzione 'auth' come ti aspetteresti. Di nuovo è difficile da dire senza vedere effettivamente il codice. –

-1

Un altro modo di fare le cose è la definizione delle modalità e poi renderli disponibili sotto via 'esportazioni'. (Module.exports e le esportazioni si riferiscono allo stesso oggetto)

function kamehameha(name,fame){ 


} 

function bigbangkamehameha(name){ 

} 



exports.kamehameha=kamehameha; 
exports.bigbang=bigbangkamehameha; //bigbang refers to bigbangkamehameha 
9

non sono sicuro se questo sarà ancora utile alle persone, ma con ES6 ho un modo per farlo che trovo pulito e utile.

class MyClass { 
    constructor (arg1, arg2, arg3) 
    myFunction1() {...} 
    myFunction2() {...} 
    myFunction3() {...} 
} 

module.exports = (arg1, arg2, arg3) => { return new MyClass(arg1,arg2,arg3) } 

E quindi si ottiene il comportamento previsto.

var MyClass = require('/MyClass.js')(arg1, arg2, arg3) 
Problemi correlati