使用async.each异步循环遍历mongoose集合

Mic*_*ael 4 javascript asynchronous mongoose mongodb node.js

acync.series在我的node.js程序上使用.我试图异步循环使用mongoose集合async.each.这是到目前为止的代码:

var async = require('async');
var mongoose = require('mongoose');
var usersData;
async.series([
    function(callback) {
        mongoose.connect("mongodb://localhost/****");
        var db = mongoose.connection;
        db.on('error', console.error.bind(console, 'connection error...'));
        db.once('open', function callback() {
            console.log('db opened!');
        });
        callback();
    },
    function(callback) {
        users = mongoose.model('User', new mongoose.Schema({name: String,age: Number}));

        users.find(function(err, userFound) {
            if (err) {console.log(err);}
            usersData = userFound;
        });
        callback();
    },
    function(callback) {
        async.each(usersData, function(userData, callback) {
            some code....
        }, callback);
    }
])
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我从异步中得到以下错误:

    if (!arr.length) {
            ^
TypeError: Cannot read property 'length' of undefined
Run Code Online (Sandbox Code Playgroud)

什么是异步循环mongoose集合的正确方法

dja*_*ski 6

因为async/await将是ES7并且已经通过转换非常受欢迎,这是谷歌搜索Mongoose和async时的最佳结果.

虽然没有回答原来的问题,但我想我会留下这个以供将来参考.

使用本机Promise(注意所有用户并行处理):

const User = mongoose.model('User', new mongoose.Schema({
  name: String,
  age:  Number
}));


function processUsers() {
  return mongoose.connect('mongodb://localhost')
    .then(function() {
      return User.find();
    })
    .then(function(users) {
      const promises = users.map(function(user) {
        return // ... some async code using `user`
      });

      return Promise.all(promises);
    });
});


processUsers()
  .then(function() {
    console.log('Finished');
  })
  .catch(function(error) {
    console.error(error.stack);
  });
Run Code Online (Sandbox Code Playgroud)

使用Mongoose的eachAsync每个用户都按顺序处理:

function processUsers() {
  return mongoose.connect('mongodb://localhost')
    .then(function() {
      return User.find().cursor().eachAsync(function(user) {
        return // ... some async code using `user`
      });
    })
});
Run Code Online (Sandbox Code Playgroud)

使用async/await:

async function processUsers() {
  await mongoose.connect('mongodb://localhost');

  await User.find().cursor().eachAsync(async function(user) {
    await // ... some async code using `user`
  });
}
Run Code Online (Sandbox Code Playgroud)