2012-02-17 3 views
1

Извините, если это основной вопрос. Я нашел информацию о создании модулей, но havent много узнал об области переменных при использовании модулей.Область переменной с использованием модулей в nodejs

Когда я первоначально написал свою программу, она была написана в виде единого документа

var mongodb = require('mongodb'); 
var server = new mongodb.Server("192.168.199.10", 27017, {}); 

new mongodb.Db('syslog', server, {}).open(function (error, client) { 
    if (error) throw error; 
    var collection = new mongodb.Collection(client, 'messages'); 


    collection.distinct("JUNOS.SRC.IP", function(err, results) { 
     var sessionCounts = []; 

     function parseSessionCounts(hosts, callback) { 
      var loop = 1, 
       numLoop = hosts.length; 

      hosts.forEach(function(element){ 
       collection.find({"JUNOS.SRC.IP": element, "JUNOS.ACTION":'closed'}).count(function(err,count){ 
        if (loop++ < numLoop){ 
         sessionCounts.push({host:element,count:count}); 
        } else { 
         sessionCounts.push({host:element,count:count}); 
         callback(); 
        } 
       }) 
      }); 
     } 

     parseSessionCounts(results, function() { 
      console.log(sessionCounts); 
      client.close(); 
     }); 
    }) 
}); 

Чтобы сделать свой код для повторного использования, я вспыхнул функцию parseSessionCount в модуль:

sessionCount.js

var sessionjs = require('./session'), 
    mongodb = require('mongodb'), 
    server = new mongodb.Server("192.168.199.10", 27017, {}); 

new mongodb.Db('syslog', server, {}).open(function (error, client) { 
    if (error) throw error; 
    var collection = new mongodb.Collection(client, 'messages'); 


    collection.distinct("JUNOS.SRC.IP", function(err, results) { 
     var sessionCounts = []; 


     sessionjs.parseSessionCounts(results, collection, sessionCounts, function() { 
      console.log(sessionCounts); 
      client.close(); 
     }); 
    }) 
}); 

и session.js

module.exports = { 

     parseSessionCounts: function (hosts, collection, sessionCounts, callback) { 
      var loop = 1, 
      numLoop = hosts.length; 

      hosts.forEach(function(element){ 
       collection.find({"JUNOS.SRC.IP": element, "JUNOS.ACTION":'closed'}).count(function(err,count){ 
        if (loop++ < numLoop){ 
         sessionCounts.push({host:element,count:count}); 
        } else { 
         sessionCounts.push({host:element,count:count}); 
         callback(); 
        } 
       }) 
      }); 
     } 


    } 

При внесении этого изменения я заметил, что мне пришлось передать переменные (коллекции и sessionCounts) в функцию, хотя вызовы функций все еще находятся в пределах определения переменной. Есть ли другой способ сделать это, не передавая переменные, или это всегда будет необходимо, поскольку это модуль, который определен за пределами области действия определенных переменных?

ответ

0

Да. JavaScript лексически ограничен, но не динамически ограничен. Хотя функция вызывается, когда переменные активны, они недоступны, потому что функция не находится в одной области. Статья в Википедии, http://en.wikipedia.org/wiki/Lexical_scope, делает довольно хорошую работу, объясняя разницу.

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