Как динамически подключаться к базам данных в Sails.js
Я перестраиваю устаревшее PHP-приложение, используя nodejs, и выбираю sailsjs примерно через неделю после изучения. Все было хорошо, пока я не понял, что в парусах у вас есть доступ только к переменным сеанса в ваших контроллерах. Таким образом, я не могу устанавливать динамические связи с моделью.
Устаревшее приложение использует глобальные переменные сеанса PHP для подключения к различным базам данных postgresql после аутентификации, и я не могу найти обходной путь в Интернете. Я видел похожие вопросы о парусах по сети. Любой узел / паруса / базы данных вундеркиндов вокруг?
Я имею в виду использование парусов для аутентификации, так как они уже работают, и использование expressjs для реализации сервисов, которые мое приложение sails будет вызывать, посылая параметры соединения db в некоторой форме микросервисной архитектуры.
В настоящее время работает паруса на localhost:1337 и мой экспресс на localhost:3000. Это хороший способ пойти?
3 ответа
Я отвечаю на свой вопрос здесь, аналогичные вопросы задавались здесь, и ни один из предоставленных ответов, похоже, не работает. Вместо использования ватерлинии в моих моделях, я успешно использовал модуль pg,
$ npm install pg --save
var pg = require('pg');
таким образом, я могу динамически передавать строку подключения от моего контроллера к моим моделям и игнорировать ORM ватерлинии.
Я создал сервис sails для получения и установки строки подключения к базе данных для каждого сеанса.
Затем для каждого запроса я передаю строку подключения, хранящуюся в сессии:
var sessionConnection = ConnectionsService.getSessionConnection(req,res);
pg.connect(sessionConnection, function(err, client, done) {
// do connection stuff and queries here
});
Надеюсь, что это помогает другим
Я думаю, что вы не можете динамически изменить connection
свойство определено в моделях. Однако вы можете попробовать не устанавливать какое-либо соединение в моделях, подключение которых будет динамически изменяться, и установить конфигурационное соединение по умолчанию в зависимости от пользователя. Что-то вроде:
User.find(1, function(err, user){
connection = select_connection_for_phones(user);
// changing the model connection dinamically
// You should not define any connection in the model.
sails.config.models.connection = connection;
Phone.find({user : user.id }, do_something_else);
});
Таким образом, ваш select_connection_for_phones
получит пользователя и вернет строковое соединение, вы установите глобальное конфигурационное соединение для моделей и после этого начнете запрос. Если в вашей модели телефона не определено соединение, он будет использовать значение по умолчанию.
Обратный путь может быть что-то вроде:
User.find(1, function(err, user){
connection = select_connection_for_phones(user);
// changing properties of the postgresql connection.
// You must define all your models with this connection.
sails.config.connections.postgresql.host = host_from_user(user);
sails.config.connections.postgresql.port = port_from_user(user);
Phone.find({user : user.id }, do_something_else);
});
В этом случае вы должны установить модели с одинаковыми соединениями, и вы динамически изменяете свойства соединения.
Я создаю адаптер sails из sails-postgresql v0.11.4 с дополнительными функциями. https://www.npmjs.com/package/sails-postgresql-pp