CNode

nodejs mongodb express一对多的两个表合并为一个json对象返回,被异步查询的问题卡住三天了,求救

问答
Sstenlylee发布于11 年前最后回复11 年前8 回复6220 浏览0 收藏

第一次用nodejs mongodb express做项目 两个表,部门、人员。人员里面有一个属性存放部门id

现在想将这两个表的结果拼成如下格式返回给浏览器:

	[
		{
			name:'部门名称',
			people:[人员对象数组]
		},
		{第二个部门}
		...
	]

首先查出所有的部门,在回调里面获得到了所有部门的数组,但是接下来就没办法了,根据部门查找到的人员数组必须在下级查询的回调里面才能获得,想不到什么办法可以用来添加到上级回调的部门数组里面。

	(伪代码)
	db.部门.find({},function(err,objs1){
		for(let i of objs1){
			db.人员.find({部门id:i._id},function(err,objs2){
				i.people=objs2;
				//由于异步的问题,在这里修改objs1显然是没用的,然后就想不到该怎么做了
			});
		}
		res.send(objs1);
	})

也查了很多东西,promise、generator、async,也自己写了函数试验,但是对于数据库自带的api,他就是用的原始的异步回调的方式,拿他没辙啊 求教改如何处理?

查看回复

回复 (8)

H
hanyuzhou2006#1·11 年前

3楼回答的很好啊,效率绝对是最高的

S
stenlylee#2·11 年前
引用 carlisliu__legacy_55765d32c4e7fbea6e9a324a

@carlisliu 看到这个代码,我算是大概明白node里面异步的执行思路了。无非就是用一个信号变量来判断异步是否执行完成,然后再去执行相关的代码。其实跟eventProxy的思路是一样的。谢谢

1
1340641314#3·11 年前

你可以使用这个populate

S
suntopo#4·11 年前

既然是异步的,在所有部门都遍历发出请求,尚未得到结果时,res.send已经执行了。所有你得不到人员信息。 1)是时候会用populate 2)也可使用eventProxy,ep.all,等待所有回调都执行了,然后再执行res.send 3)其他的方法就不知道了

 db.部门.find({},function(err,objs1){
 		var total = objs1.length;
        for(let i of objs1){
            db.人员.find({部门id:i._id},function(err,objs2){
                i.people=objs2;
                total -= 1;
                if(total == 0){
                	res.send(objs1);
                }
            });
        }
    })
2
20082496#6·11 年前

async.each()应该可以吧

W
wand933#8·11 年前

3楼的i是无法再在回调里使用的,必须再匹配一次

参与回复
登录后即可参与回复。登录