2012-05-24 2 views
0

Я играю с node.js и на основе этого wonderful tutorial Я создал двух поставщиков (SchemaProvider и EntityProvider).node.js: Область видимости импортированных модулей

Они выглядят как как:

var Db = require('mongodb').Db; 
var Connection = require('mongodb').Connection; 
var Server = require('mongodb').Server; 
var BSON = require('mongodb').BSON; 
var ObjectID = require('mongodb').ObjectID; 

EntityProvider = function(host, port) { 
this.db = new Db('timerange', new Server(host, port, {auto_reconnect: true}, {})); 
this.db.open(function() { 
    console.log("Schema Provider has connected and may be used as of now."); 
}); 
}; 

EntityProvider.prototype.getCollection = function(callback) { 
this.db.collection('entity', function(error, collection) { 
    if (error) { 
     callback(error) 
    } else { 
     callback(null, collection); 
    } 

}); 
}; 

EntityProvider.prototype.findById = function(id /* The id to be found */, callback) { 
this.getCollection(function(error, collection) { 
    if (error) { 
     callback(error); 
    } else { 
     collection.findOne({_id: id}, function(error, result) { 
      if (error) { 
       callback (error); 
      } else { 
       callback(null, result); 
      } 
     }); 
    } 
}); 
}; 

В app.js я требую ('поставщика'), где определены как поставщики.

Тогда я:

schemaProvider = new SchemaProvider('192.168.0.50', 27017); 
entityProvider = new EntityProvider('192.168.0.50', 27017); 

Теперь я создал модуль с именем dao (я из перспективных :-) Java/весна). Поскольку я не использовал «var», обе переменные и, следовательно, поставщики доступны в моем DAO. Если я использую «var», поставщики не будут доступны.

Мой вопрос:

Если бы я хотел использовать только один экземпляр поставщика на протяжении всего приложения, как бы я это сделать?

Заранее благодарен!

ответ

4

Настройка глобальных переменных (не используя var) - очень плохая практика, вы всегда должны избегать этого.

Если вы хотите иметь только экземпляр поставщика в целом приложения вы можете сделать что-то вроде этого:

provider.js

var providerInstance; 

// define provider here 

module.exports = function() { 
    providerInstance = providerInstance || new Provider('192.168.0.50', 27017); 
    return providerInstance; 
} 

Таким образом, объект поставщик получает создан только один раз и затем повторно каждый раз, когда вы это необходимо:

app.js

var provider = require('./provider')(); 

app2.js

// using the same object as in app.js 
var provider = require('./provider')(); 
+0

Я протестировать его как можно скорее :-) – Jan

+0

Хорошо, теперь у меня есть одиночки, но еще одна проблема. Я вызываю this.getCollection, а затем делаю collection.find ({}). ToArray (function (err, arr) {console.log (arr)}); но ничего не происходит :( – Jan

Смежные вопросы