2015-05-01 4 views
1

Я уверен, что это просто недоразумение, но я не могу понял это:/обновления мангуста не перезвонить мгновенно

Я пытаюсь обновить документ в MongoDB, используя мангуст на сервере узла.

Мой код выглядит следующим образом:

Message.update(searchQuery, updateQuery, function(err, response) 
{ 
    if(err) return handleError(err); 
    if(response) console.log(util.inspect(response)); 
}); 

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

Когда я вызываю функцию во второй раз, обратный вызов от первого вызова возвращается, а изменения от последнего обновления применяются к БД. Обратный вызов для второго вызова не возвращается, хотя и никаких изменений для второго вызова не выполняются.

Когда я называю это в третий раз, обратный вызов 2 возвращается и изменяет 2 применяются, но не обратный вызов и изменяет 3. И так далее ...

Я предположил, что это что-то делать с функцией мангустов непосредственно не выполняет, если не указано обратного вызова, поэтому я попытался добавить пустое «варианты» массив:

Message.update(searchQuery, updateQuery, **{}**, function(err, response){...});

или выполнения обновления в явном виде:

Message.update(searchQuery, updateQuery).exec(function(err, response){...});

Результаты не изменились.

+0

Отсутствие обратных вызовов обычно вызвано обновлением, ожидающим открытия соединения. Был ли ваш вызов 'mongoose.connect' сделан до первого вызова' update'? – JohnnyHK

+0

Вот и все! Я об этом не думал, потому что в итоге он был обновлен. Можете ли вы опубликовать свой комментарий в качестве ответа и потенциально объяснить, почему он вообще работает? – Worp

ответ

1

Недостающие Mongoose обратные вызовы, как правило, вызваны обновлением ожидания для подключения будет открыт, как и любые призывы к update, save, find и т.д., будут в очереди на Mongoose пока mongoose.connect вызов не завершен.

Так что сделайте свой звонок mongoose.connect до вашего звонка до update.

+0

Gawd! Я потратил 2 недели на добавление теста (который продолжает проходить), переключение реализаций только для того, чтобы поцарапать голову, почему мое обновление мангуста отправилось в черную дыру. Ты потрясающий !! – neofreko

0

Правильный способ вызвать обновление с мангуста является следующее:

Message.update(query, update).exec(callback); 

Что именно в вашей updateQuery?

+0

Завершить вызов: 'dbManager.updateMessage ({_id: loggedMessage._id.toString()}, {received: true}); loglogMessage - модель mongoose – Worp

+0

Зачем вы используете' _id.toString() 'здесь? А что в вашем методе dbManager.updateMessage? – tuvokki

+0

_id сам имеет тип ObjectID: 'ObjectID - _bsontype:« ObjectID »- id:« UCëÅxt' + o¸ »' и должен быть отброшен в строку для возврата «55437febc57874602b6fb895», который является идентификатором объекта в монго. – Worp

Смежные вопросы