CNode

求助,express+mongoose返回数据给echarts遇到问题

问答
Mmmqhh发布于8 年前最后回复8 年前13 回复4863 浏览0 收藏
router.get('/chart', function (req, res, next) {
  let department = [];
  stations.aggregate([{$group:{_id:"$dept",count:{$sum:1}}}]).exec((err,doc)=>{
   department.push(doc);
  });
  res.json(department);
});

代码如上,我想查询stations集合里各个部门的数量,push进一个数组然后返回给Echarts的柱状图,可是前端拿到的却是空的数组。通过调试,数据是查到了,可是到了res.json(department)这一步,department数组就变成空的了,请教这个问题该如何解决?

查看回复

回复 (13)

F
five6#1·8 年前

看看异步回掉

M
mmqhh#2·8 年前

我把res.json(department)放进mongoose的回调里就解决了耶 但是,除此之外还有什么其他解决方法吗?

L
leemove#3·8 年前
  let department = []; // 1
  stations.aggregate([{$group:{_id:"$dept",count:{$sum:1}}}]).exec((err,doc)=>{ //3
   department.push(doc);
  });
  res.json(department);// 2

这三行代码的执行顺序的问题.应该是按照我注释里的顺序运行的.第二行是异步的啊 大兄弟. 可以看看 async.

F
five6#4·8 年前

async await

M
mmqhh#6·8 年前
let department = [];
  let asynQuery = function () {
    return new Promise( (resolve, reject) => {
      stations.aggregate([{$group: {_id: "$dept", count: {$sum: 1}}}]).exec(function (err, doc) {
        department.push(doc);
        resolve(department);
      });
    });
  }
  asynQuery().then(department=>{
    res.json(department)
  });

这是我想出的另一种解决办法,大神们看看OK嘛

D
dengnan123#7·8 年前

老哥 你应该吧 res.json(department);放在exec((err,doc)=>{ department.push(doc); })

G
Gitforxuyang#8·8 年前

老哥,你没理解nodejs的异步非阻塞。

G
guo-q#9·8 年前

你试试这样 @mmqhh router.get('/chart',async function (req, res, next) { res.json(await stations.aggregate([{$group:{_id:"$dept",count:{$sum:1}}}])); });

L
lzszone#10·8 年前
.exec(function(err, doc) {
	if(err)
		throw err;
	res.json(department)
})

不用promise也可以.但是还是得学

J
jinhuiWong#11·8 年前

mark

alert(1)

K
koroshi#13·8 年前

能用8.X还是拥抱async await最爽~

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