2015-02-13 7 views
6

Sto cercando di assegnare un costruttore in una funzione autoeseguibile in NodeJS. Sono abbastanza sicuro che non funzioni perché il mio parametro è una variabile che punta a module.exports, ma sono curioso di sapere se c'è un modo per farlo funzionare rimanendo il più vicino possibile al formato auto-eseguibile.NodeJS - Come assegnare il costruttore a module.exports nella funzione autoeseguita?

Ecco come il codice viene chiamato ...

var TemplateEngine = require('./templateEngine'); 
templateEngine = new TemplateEngine({engine: 'swig'}); // "object is not a function" 

Ecco un esempio di codice che funziona bene ...

var assert = require('assert'); 
var swig = require('swig'); 

// Constructor 
var TemplateEngine = function(args) { 
    assert.ok(args.engine, 'engine is required'); 
    var templateEngine = {}; 

    templateEngine.engine = args.engine; 

    templateEngine.Render = function(templateString, model) { 
     var result = swig.render(templateString, model); 
     return result; 
    }; 

    return templateEngine; 
}; 

module.exports = TemplateEngine; 

ed ecco un esempio di stile di codice che avevo piace usare, ma che produce un errore "TypeError: Object is not a function" perché in realtà non sto assegnando a module.exports, solo una variabile che copiava qualunque cosa puntasse.

(function(templateEngine) { 
    var assert = require('assert'); 
    var swig = require('swig'); 

    templateEngine = function(args) { 
     assert.ok(args.engine, 'engine is required'); 
     var templateEngine = {}; 

     templateEngine.engine = args.engine; 

     templateEngine.Render = function (templateString, model) { 
      var result = swig.render(templateString, model); 
      return result; 
     }; 

     return templateEngine; 
    }; 
})(module.exports); 

C'è un modo per utilizzare il suddetto formato auto-eseguibile e il mio modulo esportare un Costruttore?

+0

module.exports deve essere assegnato nel 2 ° codice, forse qualcosa come module.exports = new templateEngine(); ? – dandavis

+1

devi avere molte variabili templateEngine ... – lujcon

+0

Questo stile non è necessario. Puoi usarlo per nascondere variabili private ... ma dal lato client. Con i moduli in nodejs tutto ciò che non è assegnato a module.exports è privato, quindi questo schema è inutile. – lujcon

risposta

8

Nel tuo secondo esempio, stai semplicemente sovrascrivendo il parametro templateEngine e questo non ha alcun effetto.

per ottenere lo stesso risultato come il tuo primo esempio, è sufficiente:

Passo module nella vostra IIFE:

(function(module) { 

})(module); 

Assegnare una proprietà a che:

(function(module) { 
    var assert = require('assert'); 
    var swig = require('swig'); 

    module.exports = function (args) { 
     ... 
    }; 

})(module); 
+0

Wow. Non so perché non ci ho pensato. Ci proverò quando torno a casa, ma penso che funzionerà alla grande. –

+0

Grazie per la risposta! Anche se non era in relazione diretta con quello che stavo facendo, questo è stato davvero utile per creare la mia soluzione! –

Problemi correlati