Async.series с мангустом

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();
  })

В приведенном выше коде я просто подключаюсь к своей базе данных MongoDB, размещенной на mLab, с помощью метода installConnection (). Вторая функция createUser создает документ и сохраняет его в базе данных. Обе функции затем вызываются из функции async.series () с консольным выводом

Andy
Connection successful

Я не понимаю, почему сначала выводится Энди, только потом записывается Соединение успешно, поскольку installConnection () идет перед createUser (). Кроме того, мангуст не закроет соединение (см. Функцию обратного вызова функции async.series). Может кто-нибудь объяснить мне, почему?

0
0
222
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 в анонимную функцию с параметром обратного вызова.

Jan 10.09.2018 08:51

Другие вопросы по теме