2011-11-05 65 views
1

我有一種感覺,我犯了一個明顯的錯誤,但找不到它。Node.js async.forEach:無法讀取未定義的屬性'值'

我得到的錯誤是:

node_modules/async/lib/async.js:194 
     iterator(x.value, function (err, v) { 
       ^
TypeError: Cannot read property 'value' of undefined 

這裏是我的代碼:

this.createProfiles = function (serviceUserid, serviceName, newProfiles, type, callback) { 
    var userids = []; 
    function iterator (i, callback) { 
     var profile = newProfiles[i]; 
     if (typeof profile == 'undefined') { 
      var userid = i; 
      profile = {}; 
     } else { 
      if (profile.userid) { 
       var userid = profile.userid; 
      } else if (profile.id) { 
       var userid = profile.id; 
      }    
     } 
     userid = String(userid); 
     createProfile(userid, serviceName, profile, callback); 
     userids.push(userid); 
    } 
    async.forEach(newProfiles, iterator, function(){ 
     createRelation(serviceUserid, serviceName, userids, type, callback); 
    }); 
} 

下面是完整的堆棧跟蹤:

node_modules/async/lib/async.js:194 
     iterator(x.value, function (err, v) { 
       ^
TypeError: Cannot read property 'value' of undefined 
at /Users/jacob/Sites/Konfect.node/node_modules/async/lib/async.js:194:23 
at /Users/jacob/Sites/Konfect.node/node_modules/async/lib/async.js:118:13 
at /Users/jacob/Sites/Konfect.node/node_modules/async/lib/async.js:129:25 
at /Users/jacob/Sites/Konfect.node/node_modules/async/lib/async.js:196:17 
at /Users/jacob/Sites/Konfect.node/node_modules/async/lib/async.js:499:34 
at /Users/jacob/Sites/Konfect.node/models/profile.js:85:8 
at [object Object].<anonymous> (/Users/jacob/Sites/Konfect.node/node_modules/mongodb/lib/mongodb/collection.js:416:9) 
at [object Object].emit (events.js:67:17) 
at [object Object].<anonymous> (/Users/jacob/Sites/Konfect.node/node_modules/mongodb/lib/mongodb/connections/server.js:102:16) 
at [object Object].emit (events.js:64:17) 

是的,我用async

任何想法?

+0

你確定'newProfiles'是一個數組嗎? – thejh

+0

是的,我檢查了 – webjay

+0

你有沒有設置var i? –

回答

2

異步需要一個非稀疏數組,但我猜測,根據您對'i'的用法作爲用戶標識,newProfiles被稀疏填充並通過用戶標識進行索引。

另外,迭代器的第一個參數是數組('profile')的實際值,而不是索引('i')。此外,在將「回調」傳遞給createProfile後調用「userids.push(userid)」是不正確的形式。你應該這樣做,而不是。

createProfile(userid, serviceName, profile, function() { 
    userids.push(userid); 
    callback(); 
}); 

總的來說,有一些可能的方法來解決稀疏問題。例如,你可以嘗試使用async.parallel,並傳遞一個按鍵索引的對象。

但是,首先我想問一下,不會使用稀疏來表示創建新的配置文件只會導致大量的userid碰撞?只要你用第一個項目sparse調用createProfiles兩次,它就會嘗試創建一個userid = 0的第二個配置文件。通常,當你想創建新的東西時,實際上會有'createProfile'生成並返回新的ID。

相關問題