Как динамически подключаться к базам данных в Sails.js

node.js postgresql sails.js sails-postgresql

962 просмотра

3 ответа

451 Репутация автора

Я перестраиваю устаревшее PHP-приложение, используя nodejs, и выбираю sailsjs примерно через неделю после изучения. Все было хорошо, пока я не понял, что в парусах у вас есть доступ только к переменным сеанса в ваших контроллерах. Таким образом, я не могу устанавливать динамические связи с моделью.

Устаревшее приложение использует глобальные переменные сеанса PHP для подключения к различным базам данных postgresql после аутентификации, и я не могу найти обходной путь в Интернете. Я видел подобные вопросы о парусах по сети. Любой узел / паруса / базы данных вундеркиндов вокруг?

Я подумываю использовать паруса для аутентификации, поскольку она уже работает, и использовать expressjs для реализации сервисов, которые мое приложение парусов будет вызывать, отправляя параметры соединения db в какой-либо форме микросервисной архитектуры.

В настоящее время работает паруса на localhost: 1337 и мой экспресс на localhost: 3000. Это хороший способ пойти?

Автор: Festus Yeboah Источник Размещён: 18.07.2016 11:38

Ответы (3)


1 плюс

2102 Репутация автора

Я думаю, что вы не можете динамически изменить 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);

});

В этом случае вы должны установить модели с одинаковыми соединениями, и вы динамически измените свойства соединения.

Автор: Luis González Размещён: 19.07.2016 08:24

1 плюс

451 Репутация автора

Решение

Я отвечаю на свой вопрос здесь, аналогичные вопросы задавались здесь, и ни один из предоставленных ответов, похоже, не работает. Вместо использования ватерлинии в моих моделях, я успешно использовал модуль 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

  });

Надеюсь, что это помогает другим

Автор: Festus Yeboah Размещён: 19.07.2016 12:19

0 плюса

28 Репутация автора

Я создаю адаптер sails из sails-postgresql v0.11.4 с дополнительными функциями. https://www.npmjs.com/package/sails-postgresql-pp

Автор: Fernando Franco Размещён: 16.03.2017 03:12
Вопросы из категории :
32x32