首页 > 技术文章 > 卡了很久的bug

miacara94 2018-04-27 17:30 原文

背景:在一个简单的项目中,通过循环前端传来的一个数组,使用mongodb条件查询数据,将满足条件的数据push进一个新数组,并返回至前端。

问题:每次调试到第五行,会自动跳过,直接执行12行,打印出来的数据为空

抛出一段代码:

有bug的代码:

 1 var dataArr = [];  
 2 router.get('/borrowing', (req, res) => {
 3     let params = JSON.parse(req.query.borrow); // 执行完这行,直接跳到12行执行
 4       
 5     params.state.forEach(element => {
 6         collection.findOne({'_id': element.bID}).then((data) => {
 7             dataArr.push(data);
 8             // console.log("里面"+dataArr);
 9             console.log(data);
10         })
11     });
12     console.log("外面"+dataArr); // 直接执行这行 
13     res.json({
14         "status": "ok",
15         "result": dataArr
16     });
17 });

在网上看到一些类似的问题,参照他们的例子,也找到了自己问题的答案。

首先使用async.map()遍历方法遍历数组,async.map方法是并行执行的,会等到所有数据遍历完之后,最后执行回调函数,在回调函数里就可以访问到数据传到前端。

注意:一定要在map中调用callback回调函数,不然写了也不会执行的(亲身经历)

修改之后,能获取到数据的代码:

 1 var dataArr = [];
 2 router.get('/borrowing', (req, res) => {
 3     let params = JSON.parse(req.query.borrow);
 4     async.map(params.state, (item, callback) => {
 5         collection.findOne({
 6             '_id': item.bID
 7         }).then((data) => {
 8             // dataArr.push(data);
 9             // console.log(data);
10             callback(null, data);
11         })
12     }, (err, results) => {
13         res.json({
14             "status": "ok",
15             "result": results
16         });
17     })
18 });

在解决这次bug中积累到的知识:

1、

res.json({
      "status": "ok",
      "result": results
});

不能放在循环里,只能发送一次

2、collection.find()返回符合条件的第一个文档,是一个对象,findOne()返回所有符合条件的对象,是一个数组

3、forEach()遍历数组,对数组中的每一项运行给定函数,但是没有返回值

      map()遍历数组,对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组

4、async.eachSeries()用来异步执行一系列操作,保证每次遍历都执行完毕后再执行下一步操作

 

推荐阅读