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数组就变成空的了,请教这个问题该如何解决?
看看异步回掉
我把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
.
async await
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也可以.但是还是得学
mark
alert(1)
@guo-q 这个好,学习了
能用8.X还是拥抱async await最爽~