Цикл Foreach с вызовом mongoDB / node.js - PullRequest
0 голосов
/ 27 апреля 2018
  result.forEach(element => {
    //Get each element
    console.log("LOOP");
    dbo.collection("users").findOne({email: emailGiven, "friends.email": element.email},function(errT, resultT) {
      if (errT){
        console.log("Query Error Inside!");
        res.status(errT.status); // or use err.statusCode instead 
        console.log(errT);
        //db.close();
        //return res.send(errT.message);
      }
      else {
        if (resultT) {
          var oneUser = {
            email: element.email,
            username: element.username,
            fullName: element.fullName,
            status: resultT
          };
          //console.log(resultT);
          foundUsers.push(oneUser);
        } else {
          //Not found means not added or pending
          var oneUser = {
            email: element.email,
            username: element.username,
            fullName: element.fullName,
            status: 0
          };
          foundUsers.push(oneUser);
          //console.log(emailGiven +  " " + element.email)
          console.log(oneUser);                  
        }
      }
    });
  });

у меня есть массив объектов для каждого элемента, я хотел бы сделать вызов mongoDB для каждого элемента, и в зависимости от результатов я хочу поместить результаты в массив, как я делаю, проблема в том, что mongoDb является асинхронным, поэтому мой основной поток завершил прежде чем я смогу отправить результаты в массив foundUsers, как мне решить эту проблему?

1 Ответ

0 голосов
/ 27 апреля 2018

Как вы сказали, нужно выполнить асинхронную операцию в синхронном цикле. Для этого вы можете использовать асинхронную библиотеку. Это так полезно в таких оператино.

Просто сначала установите асинхронный модуль в ваш проект npm install --save async

После этого вы можете сделать что-то вроде этого:

// for use with Node-style callbacks...
var async = require("async");

var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"};
var configs = {};

async.forEachOf(obj, (value, key, callback) => {
    fs.readFile(__dirname + value, "utf8", (err, data) => {
        if (err) return callback(err);
        try {
            configs[key] = JSON.parse(data);
        } catch (e) {
            return callback(e);
        }
        callback();
    });
}, err => {
    if (err) console.error(err.message);
    // configs is now a map of JSON data
    doSomethingWith(configs);
});

Для работы с этой библиотекой она использует функцию async.forEachOf вместо простого цикла forEach. Три параметра отправляются в эту функцию.

  1. Первый параметр, который передается в async.forEachOf - это массив для его итерации (obj).
  2. 2-й параметр - это функция обратного вызова, которая применяется к каждому элементу в объекте.
  3. Третий или последний параметр, который передается функции async.forEachOf, также является другой функцией обратного вызова. Вызывается, когда процесс итерации по каждому элементу в obj завершен.
...