2015-06-04 3 views
-2

Имея некоторые проблемы с angularjs, mongoose или MongoLab. Если вы делаете два вызова api на другой маршрут api одновременно, данные не будут загружаться. Поэтому я получил работу, ожидая завершения каждого звонка (с обещанием) перед тем, как сделать следующий звонок. Этот способ для меня не подходит для меня, потому что, если какой-либо из вызовов завершится неудачей, остальная часть страницы не будет загружаться. В любом случае я могу избежать ожидания? Вот пример того, что я получил прямо сейчас.MEAN Stack Ошибка при одновременном вызове двух разных маршрутов api

AngularJS Контроллеры Рабочий код:

// get profiles 
     HomeServices.getProfile() 
      .then(function (result) { 
       $scope.profiles = result.data; 

       // get portfolios 
       HomeServices.getPortfolios() 
        .then(function (result) { 
         $scope.portfolios = result.data; 

        }, function (error) { 
         console.log(error.statusText); 
        }); 

      }, function (error) { 
       console.log(error.statusText); 
      }); 

API,:

// profile api 
api.get('/profiles', function (req, res) { 
    // model schema 
    var profile = require('../models/Profile'); 

    // create db connection 
    var db = mongoose.createConnection(config.server.db); 

    // set model 
    var model = db.model('profile', profile, 'Profiles'); 

    // find videos 
    model.find({}, function (err, data) { 

     if (err) { 
      res.status(500).send(err); 
     } else { 
      res.status(200).send(data); 
     } 

     // disconnect db 
     mongoose.disconnect(); 
    }); 
}); 

// portfolio api 
api.get('/portfolios', function (req, res) { 
    // model schema 
    var portfolio = require('../models/Portfolio'); 

    // create db connection 
    var db = mongoose.createConnection(config.server.db); 

    // set model 
    var model = db.model('portfolio', portfolio, 'Portfolios'); 

    // find videos 
    model.find({}, function (err, data) { 

     if (err) { 
      console.log(err); 
      res.status(500).send(err); 
     } else { 
      res.status(200).send(data); 
     } 

     // disconnect db 
     mongoose.disconnect(); 
    }); 

}); 

Вот что я хочу быть в состоянии сделать:

 // get profiles 
     HomeServices.getProfile() 
      .then(function (result) { 
       $scope.profiles = result.data; 



      }, function (error) { 
       console.log(error.statusText); 
      }); 

     // get portfolios 
     HomeServices.getPortfolios() 
      .then(function (result) { 
       $scope.portfolios = result.data; 


      }, function (error) { 
       console.log(error.statusText); 
      }); 

Вот ошибку я получаю от MongoLab:

{ [MongoError: server mongolab.com:59661 sockets closed] name: 'MongoError', message: 'server db... sockets closed' } 

Обновление: удаление mongoose.disconnect(); все работает по мере необходимости. Но я не хочу создавать соединение на каждой конечной точке.

+0

Почему вы подключаете/отсоединяете от db в каждой конечной точке? Я не знаком с ошибкой, но я предполагаю, что это происходит из-за того, что вы пытаетесь установить соединения 2 db одновременно. – cdbajorin

+0

Я новичок в этом случае. Я удалил разъединение мангуста, и теперь он отлично работает. Вопрос в том, где/как создать соединение с базой данных? – iamrelos

+0

Я создаю соединение db при инициализации приложения. Ваш вопрос сильно изменился, я предлагаю задать его как новый вопрос, а не преобразовывать его из одного в другой. (подсказка: вопрос, скорее всего, уже был задан и ответил здесь на SO) –

ответ

1

Я считаю, что ошибка исходит из постоянного создания/закрытия соединения монго. Для того, чтобы поддерживать одно соединение по множеству конечных точек:

var Portfolio = require("../models/Portfolio") 
var Profile = require("../models/Profile") 
var db = mongoose.connect(config.server.db) 

db.connection.once("connected", function() { 

    api.get("/profiles", function(req, res) { ... }); 

    api.get("/portfolios", function(req, res) { ... }); 
}); 

Вы используете createConnection(), который используется для создания соединений с несколькими базами данных. Судя по этим конечным точкам, вам, вероятно, это не нужно. Вместо этого я бы использовал connect(). Я рекомендую читать больше о соединениях here

В качестве отложенного я определил портфолио и профиль в верхней части файла, так как они могут повторяться на разных конечных точках.

+0

Спасибо, что работает как шарм. – iamrelos