【发布时间】:2017-06-08 20:02:10
【问题描述】:
我正在开发 MEANJS 项目。这是一个通过递归获取数据返回数组的函数。现在,我遇到了如何获取该数组的问题。
问题:-
让用户A拥有属性为{_id:'001',rmUserId:'001'},B:{_id:'002',rmUserId:'001 '}, C {_id:'003',rmUserId:'002'}, D {_id:'003',rmUserId:'001'}, E {_id:'004',rmUserId:'009'}
如果用户 A 将登录,则 allUnderUsers 数组有 B,C,D 用户。这意味着所有用户都必须遵循自己的层次结构。
A
/ \
B D
/
C
这是我的代码:-
module.exports.getUnderUsersByRm = function(currentUser, callback) {
try {
var allUnderUsers = [];
function __getUserByRmId(rmId) {
User.find({ rmUserId: rmId, isAlive: true, status: 'active' })
.exec(function(err, users) {
if (err)
return callback(err)
if (users.length > 0) {
users.forEach(function(ele, i) {
allUnderUsers.push(ele);
__getUserByRmId(ele.rmUserId);
});
} else {
return false;
}
})
}
__getUserByRmId(currentUser._id);
} catch (e) {
callback(e)
}
}
这里我需要在调用所有递归函数后获取 allUnderUsers 数组。
我使用了回调函数,例如:-
....
...
__getUserByRmId(currentUser._id);
callback(null,'done');
.
.
但它会引发错误,即
错误:发送后无法设置标头
.at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:346:11) 在 ServerResponse.header (/home/clsah/projects/LMS/node_modules/express/lib/response.js:719:10) ........ ........
【问题讨论】:
-
return reject(err)在你的代码中做了什么?在代码中的任何地方都没有定义reject()函数。看起来您正在尝试混合回调和承诺,而实际上没有正确执行其中任何一个。 -
抱歉拼写错误。我已经编辑了它们。请现在检查。基本上,我需要在调用所有函数后使用
callback函数。 -
您需要以某种方式知道递归何时完成并执行
callback(null, allUnderUsers)。看起来__getUserBYRmId()需要它自己的回调来告诉您何时完成,如果实施得当,传递给该函数的顶级调用的回调将告诉您递归何时完成。 -
感谢@jfriend00 的回复,但我不清楚。为了更清楚,我现在再次编辑了问题。请检查。
-
你用的是什么版本的猫鼬?如果我们可以使用最新版本中内置的 Promise 支持,这将容易得多。
标签: node.js express recursion mongoose