这里有新鲜出炉的 MongoDB 教程,程序狗速度看过来!
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 web 应用提供可扩展的高性能数据存储解决方案。
这篇文章主要介绍了 javascript - 解决 mongoose 数据查询的异步操作,具有一定的参考价值,有兴趣的可以了解一下。
当我在在 node 环境下操作 mongoose 时候,发现我通过嵌套形式查询将数据循环放入一个数组时,最后得到数组一直为空,几经百度,依然无果,最后问群里的大神,原来是 mongoose 以及 node 异步造成的,百度了解决的办法,以下是我用的一个我认为比较简便的方法。
- //原来的代码
- var shoppingModel = global.dbHandle.getModel('shopping');
- var cartsshop = [];
- for (var i = 0; i < carts.length; i++) {
- shoppingModel.findOne({
- title: carts[i].title
- },
- function(err, shops) {
- if (err) {
- return next(err);
- } else {
- cartsshop.push(shops);
- }
- });
- }
- console.log(cartsshop); //[]
通过引入 node 自身含有的方法 events.
events
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。
Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时分发一个事件, 一个 fs.readStream 对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。
EventEmitter 类
events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。 你可以通过 require("events"); 来访问该模块。
以下是一个实例,
- //event.js 文件
- var EventEmitter = require('events').EventEmitter;
- var event = new EventEmitter();
- event.on('some_event',
- function() {
- console.log('some_event 事件触发');
- });
- setTimeout(function() {
- event.emit('some_event');
- },
- 1000);
将我自己的代码进行改进,如下:
- var shoppingModel = global.dbHandle.getModel('shopping');
- var cartsshop = [];
- var obj;
- var j = 0;
- var myEventEmitter = new events.EventEmitter();
- myEventEmitter.on('next', addResult);
- function addResult() {
- cartsshop.push(obj);
- j++;
- if (j == carts.length) {
- console.log(cartsshop);
- res.json(cartsshop);
- }
- }
- for (var i = 0; i < carts.length; i++) {
- var ii = i;
- shoppingModel.findOne({
- title: carts[ii].title
- },
- function(err, shops) {
- if (err) {
- return next(err);
- } else {
- obj = shops;
- myEventEmitter.emit('next');
- }
- });
- }
当然使用之前必须引入
- var events = require('events');
最后,就成功将数据取出,并返回给客户端啦。
来源: http://www.phperz.com/article/17/0524/329305.html