【问题标题】:async.series with mongoose带有猫鼬的异步系列
【发布时间】:2019-02-14 13:06:27
【问题描述】:
var mongoose = require('mongoose');
var mongoDB = "mongodb://jananton:password1@ds020168.mlab.com:20168/test_database";
var User = require('./models/User.js');
var async = require('async');

function establishConnection() {
  mongoose.connect(mongoDB, {
    useNewUrlParser: true
  }).then(
    () => {
      console.log("Connection successful")
    },
    (err) => {
      console.log("Warning!" + err)
    }
  );
  mongoose.Promise = global.Promise;
  var db = mongoose.connection;
  db.on('error', console.error.bind(console, 'MongoDB connection error:'));
}

let users = [];

function createUser(user_name, user_status, user_position) {
  var newUser = new User({
    Name: user_name,
    _id: new mongoose.Types.ObjectId(),
    Status: user_status,
    Position: user_position
  });
  newUser.save((err) => {
    if (err) {
      console.log(err);
    }
  });
  console.log(newUser.Name);
  users.push(newUser);
};

//Call both functions, starting with establishConnection
async.series([
    establishConnection,
    createUser("Andy", "Administrator", "Whatever"),
  ],
  function(err, res) {
    mongoose.connection.close();
  })

在上面的代码中,我只是通过建立连接() 方法连接到托管在 mLab 上的 MongoDB 数据库。第二个函数 createUser 创建一个文档并将其保存到数据库中。然后从 async.series() 函数内部调用这两个函数,控制台输出为

Andy
Connection successful

我不明白为什么首先输出Andy,然后才记录连接成功,因为建立连接()在createUser()之前。此外,猫鼬不会关闭连接(请参阅 async.series 函数的回调函数)。谁能解释一下为什么?

【问题讨论】:

    标签: javascript mongodb asynchronous mongoose


    【解决方案1】:

    所以你需要更正 async.series 的使用。 async.series 要求每个函数在执行完成时调用回调函数,因此该系列可以正常工作。

    async.series([
        function(callback) {
            // do some stuff ...
            callback(null, 'one');
        },
        function(callback) {
            // do some more stuff ...
            callback(null, 'two');
        }
    ],
    // optional callback
    function(err, results) {
        // results is now equal to ['one', 'two']
    });
    

    所以在你的情况下,你需要这样做,

    var mongoose = require('mongoose');
    var mongoDB = 
     "mongodb://jananton:password1@ds020168.mlab.com:20168/test_database";
    var User = require('./models/User.js');
    var async = require('async');
    
    function establishConnection(callback) {
      mongoose.connect(mongoDB, {
        useNewUrlParser: true
      }).then(
        () => {
          console.log("Connection successful")
          callback(null, "Connection successful");
        },
        (err) => {
          console.log("Warning!" + err)
          callback(err);
        }
      );
      mongoose.Promise = global.Promise;
      var db = mongoose.connection;
      db.on('error', console.error.bind(console, 'MongoDB connection error:'));
    }
    
    let users = [];
    
    function createUser(user_name, user_status, user_position, callback) {
      var newUser = new User({
        Name: user_name,
        _id: new mongoose.Types.ObjectId(),
        Status: user_status,
        Position: user_position
      });
      newUser.save((err) => {
        if (err) {
          console.log(err);
          return callback(err);
        }
      });
      console.log(newUser.Name);
      users.push(newUser);
      return callback(null, newUser);
    };
    
    //Call both functions, starting with establishConnection
    async.series([
        establishConnection,
        createUser("Andy", "Administrator", "Whatever", callback),
      ],
      function(err, res) {
        mongoose.connection.close();
      })
    

    希望这对你有帮助。

    【讨论】:

    • 谢谢,帮了大忙!我只需要将 async.series 中的函数变形为带有回调参数的匿名函数。
    猜你喜欢
    • 2013-10-24
    • 2018-05-21
    • 2018-08-09
    • 2018-03-09
    • 2016-06-22
    • 2018-08-30
    • 2015-10-23
    • 2021-03-20
    • 2018-06-09
    相关资源
    最近更新 更多