Почему я получаю сообщение об ошибке «Попытка открыть незакрытое соединение»?

Я пытаюсь подключить свое приложение node к mongodb через mongoose. Вроде работает, так как могу добавить документы, но получаю ошибку { [Error: Trying to open unclosed connection.] state: 2 }.

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

Вот мое простое приложение:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var timeSchema = new Schema({ timestamp: String });
var Time = mongoose.model('Time', timeSchema);

mongoose.connect('mongodb://localhost/mydb');

var db = mongoose.connection;

db.on('error', console.error.bind(console, 'connection error: '));
db.once('open', function () {

  var testA = new Test({ timestamp: Date() });

});

Я также пытался добавить db.close() в конец, но это не имело значения.

Это работает на Ubuntu 14.04 VPS с:

  • Node.js v0.10.3
  • МонгоДБ 2.6.3
  • Мангуст 1.4.21

person Hal Carleton    schedule 11.08.2014    source источник


Ответы (5)


По-моему, вы пытаетесь создать другое соединение, не закрывая текущее. Итак, вы можете использовать:

createConnection() вместо connect().

В вашем случае это будет выглядеть так:

db = mongoose.createConnection('mongodb://localhost/mydb');
person lvarayut    schedule 11.08.2014
comment
Спасибо, так получилось. Настоящая проблема заключалась в том, что я пытался создать другое соединение. У меня был второй сценарий, который, как я думал, не вызывается. - person Hal Carleton; 12.08.2014
comment
Важно: убедитесь, что вы создаете модели из своего соединения, а не напрямую из глобальной переменной mongoose, иначе ничего не будет сохранено. В этом примере вам нужно создать модели с db.model() вместо mongoose.model. См. хорошее объяснение на stackoverflow.com/a/10200999/3714913. - person Nateowami; 22.08.2016

У меня была та же проблема, и я обнаружил, что у меня есть указанное ниже соединение в другом файле, поэтому я не мог подключиться с другим именем базы данных. Необходимо следующее createConnection:

db = mongoose.createConnection('mongodb://localhost/mydb');

Что у меня было в другом файле:

db = mongoose.Connection('mongodb://localhost/mydb');
person Prolasis    schedule 05.10.2015

просто используйте mongoose.connect('...'); один раз.

возможно, в вашем корневом файле app.js или index.js, а не в каждой модели или файлах, связанных с базой данных, если вы их импортируете (включая).

В любом случае, если у вас все еще есть сомнения, вы можете проверить это:

var mongoose = require('mongoose'); 
var db = mongoose.connection;

db.once('connected', function() {
  console.log('mongoDB is connected');
});
person Mehdi Raash    schedule 01.06.2017

не должен твой

db.once('open', function () {

  var testA = new Test({ timestamp: Date() });

});

be

db.once('open', function () {

  var testA = new Time({ timestamp: Date() });

});

Если «Тест» - это другая схема, основанная на другом соединении, это может повлиять, я думаю

person Martian2049    schedule 31.12.2014

У меня была такая же проблема, но это было из-за опечатки:

express-sessions вместо express-session

person King Obi    schedule 28.01.2017
comment
@Buddy, спасибо за редактирование, я должен был использовать фрагмент - person King Obi; 28.01.2017