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

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

抛出一段代码:

有bug的代码:

 var dataArr = [];
router.get('/borrowing', (req, res) => {
let params = JSON.parse(req.query.borrow); // 执行完这行,直接跳到12行执行 params.state.forEach(element => {
collection.findOne({'_id': element.bID}).then((data) => {
dataArr.push(data);
// console.log("里面"+dataArr);
console.log(data);
})
});
console.log("外面"+dataArr); // 直接执行这行
res.json({
"status": "ok",
"result": dataArr
});
});

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

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

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

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

 var dataArr = [];
router.get('/borrowing', (req, res) => {
let params = JSON.parse(req.query.borrow);
async.map(params.state, (item, callback) => {
collection.findOne({
'_id': item.bID
}).then((data) => {
// dataArr.push(data);
// console.log(data);
callback(null, data);
})
}, (err, results) => {
res.json({
"status": "ok",
"result": results
});
})
});

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

1、

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

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

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

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

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

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

卡了很久的bug的更多相关文章

  1. 开源框架---tensorflow c++ API 一个卡了很久的问题

    <开源框架---tensorflow c++ API 运行第一个“手写字的例子”> 中可以说明tensorflow c++ API是好用的,.......

  2. 使用Fragment应用放置后台很久,被系统回收,出现crash

    使用Fragment应用放置后台很久,被系统回收,出现crash:原因:系统做了源码FragmentActivity调用onSaveInstanceState保存Fragment对象,这时候系统恢复保 ...

  3. 很久之前写的Ajax库

    很久之前写的一个小型AJAX的js,放在上面以免以后想玩了找不到了. // version : 0.1 beta // author : __Ajax function __Ajax(url,opti ...

  4. SVN模型仓库中的资源从一个地方移动到另一个地方的办法(很久才解决)

    弄了很久,想使用domove这个操作,但是都失败了.最后给svnkit的邮箱写了封邮件,他们告诉我这样做就成功了.实际上是使用docopy这个函数实现了move操作.package com.repos ...

  5. Yii2 关于yii\db\Connection::open耗时很久的问题(1000ms左右)

    关于这个问题我纠结了很久,每次打开网页yii\db\Connection::open几乎都耗时1000ms. 其实这个问题很好解决:只要把config\db.php配置信息里的localhost,改成 ...

  6. chrome浏览器上传图片反应很慢,延迟很久才弹出窗口

    chrome浏览器上传图片反应很慢,延迟很久才弹出窗口 一个上传图片的控件,点击按钮上传图片,用chrome(谷歌浏览器)时,点击按钮后,要等好几秒才弹出文件选择窗口 可以试一下,把网络断开,这个问题 ...

  7. 解决ssh连接慢,挂起在SSH2_MSG_SERVICE_ACCEPT信息之后很久的问题

    问题现象:无论是ssh 还是 scp 都会连接很久才提示输认证信息(注意:是连接慢) 如本机IP:192.168.18.208 (Hostname: ThinkPad) 目标主机:192.168.18 ...

  8. mysql 去除重复 Select中DISTINCT关键字的用法 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,

      在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记 ...

  9. 页面白屏并且报错PHP Parse error: syntax error, unexpected end of file in 试了很久总算解决了

    页面白屏并且报错PHP Parse error:  syntax error, unexpected end of file in 试了很久 啥短标记,打开,都试了 最简单的办法 是重新建立一个文件, ...

随机推荐

  1. C++多态的实现条件

    #include <iostream> class Person{ public: virtual void say(){ std::cout<<"person&qu ...

  2. PHP函数---$_Get()和$_Post()的用法

    一.$_Get()和$_Post()函数是用来传值的,即对应两种提交表单的方法,get和post. 二.$_Get方法 (1)获取通过URL的传值 Example 1 新建两个PHP文件,1.php, ...

  3. 非常好的LINUX学习者博客

    http://blog.csdn.net/qq_21794823/article/category/6496200

  4. CAS单点登录学习(二):客户端配置

    下载jar包因为cas的源码修改变动很大,所以客户端引入的jar包根据服务端的war包而定.之前搭建的cas服务端用的版本是3.5.2,经过测试,可以使用cas-client-core的3.2.1版本 ...

  5. Java多线程运行机制的基本原理

    Java多线程运行机制的基本原理 进程和线程的区别 进程 进程是一个程序执行的实例,比如说我们打开10个IE浏览器窗口,那么就有10个进程开启.一个进程可以同时被运行若干次,进程是CPU进行资源分配和 ...

  6. string.Format的困惑

    今天在执行一个format时出现了这样一个问题,困惑了很久,就是 string.Format("{0:00}",“1”)结果是1 string.Format("{0:00 ...

  7. Centos7更新阿里yum源

    一.下载repo文件 wget http://mirrors.aliyun.com/repo/Centos-7.repo 二.备份并替换系统的repo文件 cp Centos-7.repo /etc/ ...

  8. SQL Server等待事件新解

    资源等待类型 并行:CXPACKET Buffer:PAGEIOLATCH_X 非Buffer:LATCH_X I/O:ASYNC_IO_COMPITION:IO_COMPITION CPU:SOS_ ...

  9. 每次移1px的无缝轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Solr 6.7学习笔记(05)-- highlighter

    搜索结果高亮显示是搜索引擎中的常用功能,在Solr中,我们可以如下配置: <requestHandler name="/select" class="solr.Se ...