Подтвердить что ты не робот

Запросы зависают при использовании mongoose.createConnection() vs mongoose.connect()

Работает:

var mongoose = require('mongoose');

var db = function() {
  return {
    config: function(conf) {
      mongoose.connect('mongodb://' + conf.host + '/' + conf.database);
      var db = mongoose.connection;
      db.on('error', console.error.bind(console, 'connection error:'));
      db.once('open', function callback() {
        console.log('db connection open');
      });
    }
  };
};

module.exports = db();

Не работает:

var mongoose = require('mongoose');

var db = function() {
  return {
    config: function(conf) {
      var db = mongoose.createConnection('mongodb://' + conf.host + '/' + conf.database);
      db.on('error', console.error.bind(console, 'connection error:'));
      db.once('open', function callback() {
        console.log('db connection open');
      });
    }
  };
};

module.exports = db();

Код вставки:

'use strict';


var mongoose = require('mongoose'),
User = mongoose.model('User'),
p = require('../lib/promise');

...
app.post('/user', function (req, res) {
  res.format({
    json: function () {
      //extract the user from the req
      try {
        var user = new User();
        user.firstName = req.body.firstName;
        user.lastName = req.body.lastName;
        user.userName = req.body.userName;
        user.password = req.body.password;
        user.email = req.body.email;

        user.save(function(err, data) {
        //omitted
...
4b9b3361

Ответ 1

К сожалению, это не простой рефакторинг.

1) .createConnection vs .connect

При использовании .createConnection вы получаете доступ к моделям через явное соединение, которое вы создаете с помощью этого вызова.

Это означает, что вместо User = mongoose.model(...) вам нужно User = db.model(...).

Примеры (один, два, три, четыре) показывают, что это не сложно, но изменение достаточно тонкое, что многие пропустили его. Документы также не очень понятны, что, вероятно, является основной причиной.

2) ваше приложение kraken и .createConnection

Если вы строите один из примеров kraken, вам нужно сделать несколько изменений.

  • Измените код вокруг .createConnection, чтобы вы могли получить доступ к возвращаемому объекту. В текущей форме вы возвращаете объект с помощью функции config, но вы не возвращаете объект соединения, который генерирует .createConnection.
  • Обновите index.js, если вы измените способ настройки/создания соединения в db.config. Возможно, вы сможете избежать этого, но я подозреваю, что вы перепишете весь db.js вокруг нового вызова.
  • Убедитесь, что код/​​контроллеры, работающие с моделями, имеют доступ к объекту, возвращаемому вашим .createConnection. Это означает как способ доступа к объекту, так и изменение любого места, где вы устанавливаете переменную, чтобы он использовал формат var xyz = db.model('XYZ') и т.д.

Извините, что нет простого однострочного ответа...