2013-12-20 6 views
13

Я совершенно не знаком с mongoDB и не испытываю Node.js, поэтому, пожалуйста, извините, если код ниже далек от совершенства.Удаление документов из коллекции mongodb от node.js

Целью является удаление документа из коллекции, на который ссылается его _id. Удаление выполнено (отмечено в оболочке mongo), но код не заканчивается (запуск node myscript.js не возвращает мою оболочку). Если я добавлю db.close(), я получаю { [MongoError: Connection Closed By Application] name: 'MongoError' }.

var MongoClient = require("mongodb").MongoClient; 
var ObjectID = require("mongodb").ObjectID; 

MongoClient.connect('mongodb://localhost/mochatests', function(err, db) { 
    if (err) { 
     console.log("error connecting"); 
     throw err; 
    } 
    db.collection('contacts', {}, function(err, contacts) { 
     if (err) { 
      console.log("error getting collection"); 
      throw err; 
     } 
     contacts.remove({_id: ObjectID("52b2f757b8116e1df2eb46ac")}, {safe: true}, function(err, result) { 
      if (err) { 
       console.log(err); 
       throw err; 
      } 
      console.log(result); 
     }); 
    }); 
    db.close(); 
}); 

Не нужно ли закрывать соединение? Что происходит, когда я не закрываю его, и программа не заканчивается?

Спасибо!

+2

Ничего не происходит, ваша программа просто ждет некоторого I/O от водителя Монго. Конечно, вы знаете, что ничего не прибудет, и вы ничего не отправите, но Node этого не знает, и поэтому он не может закончить. – kamituel

ответ

18

Добро пожаловать в асинхронном стиле:

  • Вы не должны использовать бросок для обратного вызова, бросок хорош для функции стека
  • db.close() должен быть в функции обратного вызова, после удаления делается.

Пример:

MongoClient.connect('mongodb://localhost/mochatests', function(err, db) { 
    db.collection('contacts', {}, function(err, contacts) { 
     contacts.remove({_id: ObjectID("52b2f757b8116e1df2eb46ac")}, function(err, result) { 
      if (err) { 
       console.log(err); 
      } 
      console.log(result); 
      db.close(); 
     }); 
    }); 
}); 
+0

Это сработало хорошо, спасибо :) – marc0s

+0

Это работает, но я хотел бы понять, почему вы должны позвонить близко, поэтому удаление действительно происходит ... – Jeep87c

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