很抱歉,如果这是一个基本问题。我已经找到了有关创建模块的信息,但在使用模块时没有发现有关变量范围的信息。
当我最初编写程序时,它是作为单个文档编写的
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();
}
})
});
}
}
在进行此更改时,我注意到我现在必须将变量(collection和sessionCounts)传递给函数,即使函数调用仍在变量定义的范围内。是否有另一种方法可以在不必传递变量的情况下执行此操作,或者是否始终需要这样做,因为它是在定义的变量范围之外定义的模块?
答案 0 :(得分:0)
是。 JavaScript是词法范围的,不是动态范围的。即使在变量处于活动状态时调用该函数,也无法访问它们,因为该函数不在同一范围内。维基百科的文章http://en.wikipedia.org/wiki/Lexical_scope在解释差异方面做得非常好。