Экспресс-js использует значения из mongodb за пределами запроса

#node.js #mongodb #express

#node.js #mongodb #экспресс

Вопрос:

Я новичок в express js и node js. Мне интересно, возможно ли это сделать или нет.

первое, что я пытаюсь подсчитать по 1 запросу.

2-й я запрашиваю вход в систему коллекции. выполните цикл, отформатируйте и получите значения имен, используя идентификаторы.

Я получаю undefined на count1 и вижу, что он пропущен в ответе json.

как мне передать результаты запроса за пределы запроса?

 router.post('/logmein', function(req, res, next) {
    var email = req.param('email');
    var password = req.param('password');
    var count1;

    MongoClient.connect(MongoUrl, function(err, db) {
        if (err) return;

        db.collection('users').count({email: email,password: md5(password)}, function(err, count) {
            count1 = count;
        });

        db.collection('login').find({email: email,password: md5(password)}).toArray(function(err, results){
            console.log(results); // output all records
        });


        //use results
        /*
        foreach each results format with other info

        var new_array;
        */
        res.json({"success": true,"count":count1,new_array: new_array});
    }); 
});
  

Комментарии:

1. какую ошибку вы получаете при попытке выполнить приведенный выше код? вы пробовали просто возвращать результаты вместо того, чтобы выводить их на консоль?

2. Я получаю неопределенное значение для переменной count1.

Ответ №1:

Проблемы с асинхронностью, вам нужно больше на это смотреть. Используйте асинхронный модуль, и тогда вы сможете запускать запросы параллельно. Наконец, вы получите результаты в последнем обратном вызове. Этот фрагмент решит вашу проблему:

 var async = require('async');

router.post('/logmein', function (req, res, next) {
  var email = req.param('email');
  var password = req.param('password');
  var retResults;
  var count1;

  MongoClient.connect(MongoUrl, function (err, db) {
    if (err) return;

    async.parallel([
      function(callback){ 
        db.collection('users').count({ email: email, password: md5(password) }, function (err, count) {
          return callback(err, count);
        });
      },
      function(callback){
        db.collection('login').find({ email: email, password: md5(password) }).toArray(function (err, results) {
          return callback(err, results);
        });
      }
    ], function(err, results) {
      if (err) {
        // @todo: handle the error
      }

      count1 = results[0];
      retResults = results[1];


      //use results
      /*
      foreach each results format with other info

      var new_array;
      */
      res.json({ "success": true, "count": count1, new_array: new_array });

    };
  });
});
  

Комментарии:

1. Я все еще получаю неопределенные значения для count1 и retResults.

2. также, когда я попытался поместить console.log (retResults); вызов не завершается.

3. @LJBoy Я забыл ввести обратные вызовы. Просто исправил это, попробуйте еще раз.

4. о, спасибо. Я также поместил res.json({ «success»: true, «count»: count1, new_array: new_array }); внутри последней функции. это не сработало снаружи.

5. @LJBoy да, просто заметил это и переместил. Если вы довольны, вы можете принять ответ 🙂

Ответ №2:

Вам нужно что-то вроде async.parallel для управления асинхронным потоком вашего приложения nodejs

 async.parallel([
    function(callback){ ... },
    function(callback){ ... }
], function(err, results) {
    // optional callback
};