Я работаю над Saas-приложением (отдельная БД для каждого клиента), бэкэнд uisng node js, express и mysql и sequenceize orm. URL: http://example.com/customer/api Здесь количество клиентов может исчисляться тысячами Теперь мне нужно получить это имя клиента и подключиться к этой базе данных, а затем направить все запросы в эту базу данных. Когда бы ни поступил запрос, это должно быть сделано. // сначала подключаемся к базе данных клиента Затем app.use('/api', маршруты) маршруты здесь есть все маршруты в приложении. Что нужно сделать, чтобы справиться с этим? Мне нужен способ подключения к этой базе данных клиентов по мере поступления запросов, а затем обработки запросов в этой базе данных клиентов.
Понял. Я подключаюсь к базе данных с помощью sequenceize и сохраняю это соединение в переменной, и эта переменная отправляется в req.db = connection. Это в одном промежуточном программном обеспечении, после которого я вызываю next(). Который пойдет в app.use('/api', route). Мой вопрос: знают ли здесь маршруты, к какой базе данных подключаться?
да, так как промежуточное ПО запускается при каждом запросе,
Как вы получаете соответствующую базу данных?
промежуточное программное обеспечение может маршрутизировать между различными базами данных, например, пользователь «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
и ищут строку подключения. С помощью строки подключения они знают, какую БД использовать.
Можете ли вы добавить какой-нибудь фиктивный код и уточнить?
Мне кажется, что любое соединение с базой данных, указанное в запросе, выполняется в самой базе данных? Без дальнейших изменений @stingscreen
Не могли бы вы поделиться кодом? @Сатвик Бхандар
Текущий 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); // Здесь ошибка из-за добавления имени клиента
Могу ли я сделать как app.use('/customer'), а затем app.use('/api', маршруты)
предполагая, что вы внедрили аутентификацию, сохраните информацию о клиентской базе данных в базе данных вашего приложения. когда запрос поступает на основе токена аутентификации клиента, найдите информацию о базе данных клиента и динамически подключитесь к этой базе данных. Выполните то, что было отправлено для каждого запроса, и закройте соединение. К вашему сведению: поскольку запрос выполняется через http, невозможно сохранить соединение с базой данных для следующих последовательных запросов клиента, если вы не переключитесь на веб-сокет.