6

「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 が定義されているという事実に私は奇妙に思いますが、そのメソッド内では「未定義」です。なぜこれが起こっているのか、誰かが光を当てることができますか?

4

1 に答える 1

1

github でソースコードをチェックアウトするだけです。スタック トレースの 2 行目を見ると、at /home/duet/www/git/node-rackspace/node_modules/clouddns/lib/clouddns/core.js:209:14

そのため、_wrapDomains はcreateDomainメソッド内のファイルの末尾に向かって呼び出されます (209 行目)。そこで調べてみると、null 値で呼び出している理由がわかります。

于 2013-09-30T15:54:59.803 に答える