dman
dman

Reputation: 11064

Node require() issue with 2 scripts that require each other

I have 2 different node scripts... save_info.js imports openConections array from sse_server.js. And, sse_server.js imports function broadcast from save_info.js. However, this is causing openConnections array to be undefined inside of save_info.js. Why is this and how can I fix this?

save_info.js:

var openConnections = require('../scripts/sse_server.js').openConnections;

function broadcast(result, event, httpObject) { 
    var result = JSON.stringify(result);
    var date = new Date().getMilliseconds();
    httpObject.write('id: ' + date + '\n');
    httpObject.write('data: { \"' + event + '\":\n');
    httpObject.write('data:' + result + '\n');
    httpObject.write('data: }' + '\n\n');
}

 function db_finish(err, product, numberAffected, 
                   result, event) {
    if (err) { console.log(err) }
    else { 
        console.log("Db insert successfull");
        openConnections.forEach(function(httpObject) {
            broadcast(result, event, httpObject);
        });
    }
    console.log("Numer effected " + numberAffected);
}
module.exports.openConnections = openConnections;

sse_server.js:

var broadcast = require("../data/save_info").broadcast; 

var openConnections = []; 

    for (var model in models){
        models[model].find({}).sort({_id: -1}).limit(1).exec(
            function (err, result){
                broadcast(result, model, res);
            });
    }
 module.exports.broadcast = broadcast;

Upvotes: 0

Views: 87

Answers (1)

Ben
Ben

Reputation: 5074

To prevent circular dependency, nodejs module loader stops loading sse_server module in save_info.js That's why openConnections is undefined. To resolve this, do the following:

1) Move broadcast() out into a separate module (broadcast.js for example).

2) put require('../data/broadcast.js') in both sse_server.js and save_info.js

3) Remove require('../data/save_info') in sse_server.js

Upvotes: 1

Related Questions