Направьте все запросы на конкретный экспресс-узел базы данных js

Я работаю над Saas-приложением (отдельная БД для каждого клиента), бэкэнд uisng node js, express и mysql и sequenceize orm. URL: http://example.com/customer/api Здесь количество клиентов может исчисляться тысячами Теперь мне нужно получить это имя клиента и подключиться к этой базе данных, а затем направить все запросы в эту базу данных. Когда бы ни поступил запрос, это должно быть сделано. // сначала подключаемся к базе данных клиента Затем app.use('/api', маршруты) маршруты здесь есть все маршруты в приложении. Что нужно сделать, чтобы справиться с этим? Мне нужен способ подключения к этой базе данных клиентов по мере поступления запросов, а затем обработки запросов в этой базе данных клиентов.

предполагая, что вы внедрили аутентификацию, сохраните информацию о клиентской базе данных в базе данных вашего приложения. когда запрос поступает на основе токена аутентификации клиента, найдите информацию о базе данных клиента и динамически подключитесь к этой базе данных. Выполните то, что было отправлено для каждого запроса, и закройте соединение. К вашему сведению: поскольку запрос выполняется через http, невозможно сохранить соединение с базой данных для следующих последовательных запросов клиента, если вы не переключитесь на веб-сокет.

bogdanoff 17.05.2022 11:50

Понял. Я подключаюсь к базе данных с помощью sequenceize и сохраняю это соединение в переменной, и эта переменная отправляется в req.db = connection. Это в одном промежуточном программном обеспечении, после которого я вызываю next(). Который пойдет в app.use('/api', route). Мой вопрос: знают ли здесь маршруты, к какой базе данных подключаться?

Sathvik Bhandar 17.05.2022 12:17

да, так как промежуточное ПО запускается при каждом запросе,

bogdanoff 17.05.2022 16:18
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
3
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как вы получаете соответствующую базу данных? промежуточное программное обеспечение может маршрутизировать между различными базами данных, например, пользователь «x» делает запрос. Промежуточное ПО ищет соответствующую базу данных для пользователя x и помещает строку подключения для базы данных в req. Обработчик запроса получает строку conn и подключается к соответствующей базе данных. Соединение может быть кэшировано, например, с помощью node-cache, а затем извлечено позже, когда клиенту потребуется другой запрос.

Редактировать:

какой-то код

var express = require('express');
var app = express();
    
var getDb = function (req, res, next) {
  req.body.username //get for example the username
  //search for the corresponding connection string in the database
  //then add it to the request
  req.databaseString = connString //connString --the connection 
  // String you got earlier
  next();
};
    
app.use(getDb);
    
app.get('/makeSomething', function (req, res) {
  //connect to db with req.databaseString
  //do what you wanna do
    
  res.send('done');
});
    
app.listen(3000);

Дополнение к вашему комментарию выше. «Мой вопрос: знают ли маршруты здесь, к какой базе данных подключаться?» маршруты знают об этом, когда смотрят в req и ищут строку подключения. С помощью строки подключения они знают, какую БД использовать.

Можете ли вы добавить какой-нибудь фиктивный код и уточнить?

Sathvik Bhandar 17.05.2022 11:05

Мне кажется, что любое соединение с базой данных, указанное в запросе, выполняется в самой базе данных? Без дальнейших изменений @stingscreen

Sathvik Bhandar 17.05.2022 11:37

Не могли бы вы поделиться кодом? @Сатвик Бхандар

stingscreen 17.05.2022 13:31

Текущий URL-адрес проекта: локальный хост: 3000/апи{allRoutes} Все работает до сих пор, после добавления в новый формат URL-адреса он не работает. Я хочу взять имя клиента из URL-адреса, например, локальный: 3000/TestCustomer/API{allRoutes} var getDb = function (req, res, next) { const client = req.url.split('/'); постоянный клиент = клиент[1]; req.db = connString клиента; следующий(); }; приложение.use(getDb); //До сих пор работает нормально app.use('/api', route); // Здесь ошибка из-за добавления имени клиента

Sathvik Bhandar 17.05.2022 15:11

Могу ли я сделать как app.use('/customer'), а затем app.use('/api', маршруты)

Sathvik Bhandar 17.05.2022 15:21

Другие вопросы по теме