Блокировка node.js, неблокирующая проблема в операторе for - PullRequest
0 голосов
/ 12 мая 2018

Как я могу сохранить все JSON в моем MongoldB?Как ни странно, только первое значение сохраняется каждый раз.Это может быть проблема блокировки / неблокирования.

json = {
  ["name":"Karl","id":"azo0"],
  ["name":"Robert","id":"bdd10"],
  ["name":"Joan","id":"difj90"],
  ["name":"Hallyn","id":"fmak88"],
  ["name":"Michael","id":"vma91"]
};

for(var i = 0; i < json.length; i++){
  id = json[i].id;
  name = json[i].name;

  var ctx = {"id":id,"name":name};
  db.json_db.count(ctx).exec(function(err, count) {
    if(count < 1){
        var model = new User({
           "name":json[i].name,
           "id":json[i].id
        });
        model.save(function(){
            console.log("ok"+i);

        });
    }
  });
};

После вставки все данные заполняются ["name": "Karl", "id": "azo0"] Для проверки консоли.log ("ok" + i), он всегда печатает "ok0", а не "ok1", "ok2", "ok3" ... и т.д ..

Как я могу предотвратить эту проблему?

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Если вы используете пакет Async , это лучший способ решить вашу проблему ...

  async.eachSeries(json, (item, done) => {
   let user = new User(
                     {
                        "name":json[i].name,
                         "id":json[i].id
                    },
                    (err, user) => {
                        if(err){
                           // handle err
                        }
                        return done();
                    }
                );
});
0 голосов
/ 12 мая 2018

.exec() говорит мне, что вы используете Mongoose . Таким образом, ваш цикл может быть переписан как:

const json = [
  {name: "Karl", id: "azo0"},
  {name: "Robert", id: "bdd10"},
  {name: "Joan", id: "difj90"},
  {name: "Hallyn", id: "fmak88"},
  {name: "Michael", id: "vma91"}
];

for (const item of json) {
  const count = await db.json_db.count(item).exec()
  if (!count) {
    await new User(item).save()
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...