2015-02-13 2 views
0

Я создал менеджер соединений Mongoose для управления уникальным подключением для каждого пользователя в моем приложении. В то время, когда пользователь входит в систему, я создаю новое подключение к пользовательскому URI базы данных, который является уникальным для этого пользователя. Я называю соединение так, чтобы его можно было найти (посмотрел вверх) позже. Пример invocation:MEAN.JS - Запросить объекты, Экспресс-контроллеры и схемы Mongoose

var myConnection = require('connection-manager').createConnection(user._id); 

Как вы можете видеть здесь, я называю свои соединения после свойства _id объекта пользователя. Достаточно легко. Затем я могу посмотреть свою уникальную связь этого пользователя с помощью:

var myConnection = require('connection-manager').getConnection(user._id); 

Единственное различие между этими двумя методами является то, что один создает и возвращает новое соединение, а другой (метод GetConnection()) делает простой вид в пуле текущих соединений и возвращает объект соединения, который соответствует нашему прошедшему имени (user._id).

Вот где я столкнулся с проблемами. В моих серверных контроллерах я обычно делаю это:

var mongoose = require('mongoose'), 
    Foo = mongoose.model('Foo'); 

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

exports.create = function(req, res, next) { 
    myFoo = new Foo({whatever: whatever}); 
}; 

Это работает, потому что Foo был объявлен и загружен в начале файла. Но теперь, когда я двигаюсь к менеджеру соединения, мне нужно, чтобы быть в состоянии сделать что-то вроде этого в моем файле контроллера:

'use strict'; 

var manager = require('connection-manager').getConnection(user._id), 
    Foo = manager.model('Foo'); 

exports.create = function(req, res, next) { 
    var myFoo = new Foo({whatever: whatever}); 
}; 

Проблема заключается в том, что объект запроса, который получает передается exports.create() где user._id - это то, что мне нужно, чтобы посмотреть мое настраиваемое соединение в диспетчере соединений. Как мне обойти это?

+0

* «Но что, если бы я хотел получить доступ к этому объекту запроса за пределами create()?» * Просьба привести пример, поскольку это не имеет никакого смысла. Доступ к нему за пределами create() не будет слишком полезен. –

+0

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

+0

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

ответ

1

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

'use strict'; 

var manager = require('connection-manager'); 

exports.create = function(req, res, next) { 
    var connection = manager.getConnection(req.user._id), 
     Foo = connection.model('Foo'), 
     myFoo = new Foo({whatever: whatever}); 
}; 
+0

Hah! Интересно, что это в настоящее время то, что у меня есть. Но для меня это очень дурно. потому что теперь мне нужно сделать getConnection() и загрузить модель для каждого из методов, принадлежащих моему контроллеру. Где я делал это только один раз, теперь мне нужно делать это много мест. –

+0

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

+0

Я тоже об этом думал. Думаю, на время я оставлю это Спасибо большое за помощь. Я очень ценю это. –

0

В коде выше:

app.route('/someroute').post(foo.create); 

It труб запрос непосредственно foo.create, который является своего рода запутанным для начинающих, что это на самом деле означает:

app.post('/someroute', function(req, res, next) { 
    //get your data here 
    //user = req.user_id; 
    foo.create(req, res, next); 
}); 

Мое предложение, не используйте стек MEAN для начала, создайте простое экспресс-приложение и выясните, как работают маршруты.

И использовать express.Router() вместо app.route.

Спасибо.

+0

Я ценю ваш ответ, но, к сожалению, он не очень подходит для моего обновленного сообщения. Я полностью переписал его, чтобы уточнить, в чем именно моя проблема: я бы хотел, чтобы я был быстрее, поэтому вы бы не потратили впустую свое время :( –

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