Node.js + Mongoose ... Проблема управления потоком? - PullRequest
3 голосов
/ 02 марта 2012

Я только начал играть с node.js, имел некоторый опыт работы с JavaScript, но очень мало на стороне сервера.

У меня есть приведенный ниже код, и нужная мне функциональность слишком сложнапродукт в коллекцию, используя Mongoose, однако, если дубликат найден с использованием «имени», то отправьте продукт в виде внедренного документа в дубликат, используя только выбранную информацию, такую ​​как product_ids, информация о пакете и т. д. Я предполагаю,проблема в том, что findOne не находит дубликаты при первом запуске.Если я запускаю его второй раз, он обнаруживает дубликаты, но к тому времени уже слишком поздно.Я не уверен, как заставить findOne работать только после того, как произошло предыдущее сохранение.

function insertProduct(data) {
    var product;
    Product.findOne({
        name: data.name
    }, function(err, doc) {
        if (err) throw err;
        if (!doc) {
            product = new Product({
                name: data.name
                //other product data
            });
            product.packages.push({
                //package data
            });
        }
        else if (doc) {
            doc.packages.push({
                //package data
            });
            product = doc;
        }
        product.save(function(err) {
            if (err) throw err;
            console.log('Added: ' + product.name);
        });
    });
}

request(url, function(error, response, body) {
   if (!error && response.statusCode === 200) {
      jsonResult = JSON.parse(body);
      jsonResult.result.forEach(insertProduct);
   }
});

Я понимаю, что это должно быть проблемой с потоком управления, что я все еще пытаюсь получитьдержатьВаша помощь приветствуется!

1 Ответ

1 голос
/ 02 марта 2012

Добро пожаловать в мир неблокирующих операций ввода-вывода и JavaScript-замыканий :)

Более простой способ - разделить создание продукта и отправить пакеты после успешного создания продукта.

addProduct = function(name, next) {
  Product.findOne({name: name}, function(err, doc) {
    if(doc) {
      next(null, doc);
    }
    else {
      // create new product...
      var d = new Product({name: name});
      next(null, d);
    }
  });
});

// ... snipped

jsonResult.result.forEach(function(item) {
  addProduct(item.name, function(err, doc) {
    if(err == null) {
      doc.packages.push({
        // stuffs
      });
      doc.save();
    }
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...