Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NodeJS - How to assign constructor to module.exports in self-executing function?

I'm trying to assign a constructor in a self-executing function in NodeJS. I'm pretty sure it's not working because my parameter is a variable pointing to module.exports, but I'm curious if there's a way to make it work while staying as close to the self-executing format as possible.

Here's how the code is being called...

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

Here's an example of code that works fine...

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;

and here's an example of the code style I'd like to use, but which produces a "TypeError: Object is not a function" error because I'm not actually assigning to module.exports, just a variable that copied whatever it was pointing to.

(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);

Is there a way for me to use the above self-executing format and have my module export a Constructor?

like image 849
Tim Hardy Avatar asked Feb 13 '15 19:02

Tim Hardy


1 Answers

In your second example, you are simply overwriting the templateEngine parameter, and that's not going to have any effect.

To get the same result as your first example, simply:

Pass module into your IIFE:

(function(module) {

})(module);

Assign a property to that:

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

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

})(module);
like image 56
JLRishe Avatar answered Nov 02 '22 15:11

JLRishe