求助,express+mongoose返回数据给echarts遇到问题
发布于 4 个月前 作者 mmqhh 869 次浏览 来自 问答
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 回复

看看异步回掉

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

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

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

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嘛

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

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

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

.exec(function(err, doc) {
	if(err)
		throw err;
	res.json(department)
})

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

@guo-q 这个好,学习了

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

回到顶部