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) 

是的,我使用asynchronous 。

有任何想法吗?

asynchronous期望一个非稀疏的数组,但我猜测,根据您的使用'我'作为userid,newProfiles稀疏填充和索引的用户ID。

另外,迭代器的第一个参数是数组('profile')的实际值,而不是索引('i')。 此外,在将“callback”传递给createProfile后,调用“userids.push(userid)”是不正确的forms。 你应该这样做,而不是。

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

总的来说,有一些可能的方法来解决稀疏问题。 例如,你可以尝试使用async.parallel,而不是通过键索引的对象。

但是首先我想问一下,不会使用稀疏来表示创build新的configuration文件只会导致大量的用户ID冲突? 一旦你用第一个项目sparse调用了createProfiles,它就会尝试创build一个userid = 0的第二个configuration文件。通常当你想创build新的东西时,实际上会有'createProfile'生成并返回新的ID。