CNode

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

问答
Mmmqhh发布于9 年前最后回复9 年前13 回复4870 浏览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)

M
mmqhh#1·9 年前

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

G
Gitforxuyang#2·9 年前

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

G
guo-q#3·9 年前

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

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

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

J
jinhuiWong#5·9 年前

mark

alert(1)

F
five6#7·9 年前

看看异步回掉

L
leemove#8·9 年前
  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#9·9 年前

async await

M
mmqhh#11·9 年前
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#12·9 年前

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

K
koroshi#13·9 年前

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

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