传递给函数的Node.js'undefined'variables

我正在使用“clouddns”模块将〜800个域名导入Rackspace帐户。 我不断收到一个错误,说如下

TypeError: Cannot call method 'forEach' of undefined at _wrapDomains (/home/duet/www/git/node-rackspace/node_modules/clouddns/lib/clouddns/core.js:146:17) at /home/duet/www/git/node-rackspace/node_modules/clouddns/lib/clouddns/core.js:209:14 at Request._callback (/home/duet/www/git/node-rackspace/node_modules/clouddns/lib/clouddns/common.js:170:5) at Request.self.callback (/home/duet/www/git/node-rackspace/node_modules/clouddns/node_modules/request/main.js:120:22) at Request.EventEmitter.emit (events.js:98:17) at Request.<anonymous> (/home/duet/www/git/node-rackspace/node_modules/clouddns/node_modules/request/main.js:555:16) at Request.EventEmitter.emit (events.js:95:17) at IncomingMessage.<anonymous> (/home/duet/www/git/node-rackspace/node_modules/clouddns/node_modules/request/main.js:517:14) at IncomingMessage.EventEmitter.emit (events.js:117:20) at _stream_readable.js:920:16 

看了一下有问题的库文件(core.js)之后,我决定在那里扔几个日志语句,看看能不能找出发生的事情。 这里是代码:

 CloudDNS.prototype.getDomains = function getDomains(options, callback) { var args = Array.prototype.slice.call(arguments), callback = args[args.length - 1]; if (typeof callback !== 'function') { throw new Error("This method requires a callback"); } var self = this; var reqOpts = { method: 'GET', uri: this.dnsUrl('domains'), client: this } if ((arguments.length > 1) && (typeof arguments[0] === 'object')) { reqOpts.params = { name: args[0] } } this.rackspace(reqOpts, callback, function(body) { var result = JSON.parse(body); console.log(result.domains); //good here, it's an array and I can even forEach on it! self._wrapDomains(result.domains, callback); //undefined wtf? console.log(result.domains); //same as before, works brilliantly }); }; CloudDNS.prototype._wrapDomains = function _wrapDomains(domainArray, callback) { var self = this; var results = []; console.log(domainArray); //reports undefined domainArray.forEach(function(domain) { results.push(new(clouddns.Domain)(self, domain)); }); return callback(null, results); } 

由于result.domains是在调用方法之前和之后定义的,但是在这个方法里面,它是'未定义的'。 谁能说出为什么会发生这种情况?

我只是在github上签出源代码。 如果你看看你的堆栈跟踪中的第二行,它at /home/duet/www/git/node-rackspace/node_modules/clouddns/lib/clouddns/core.js:209:14

所以_wrapDomains被调用到createDomain方法中的文件末尾(在第209行)。 如果你在那里调查,你会发现它为什么用空值调用它。