Как динамически связывать источники данных для запросов API в loopback - PullRequest
0 голосов
/ 26 апреля 2018

Вот сценарий, в котором разные запросы API должны запрашивать разные базы данных динамически в зависимости от источника запроса. Например, запрос API должен запрашивать таблицу пользователей в db1 одновременно, другой API или тот же API с другим контекстом источника должен запрашивать таблицу пользователей из db2. Это может быть достигнуто для всех маршрутов, кроме тех, которые используются по умолчанию в режиме loopback. Мне нужно решение для динамического связывания источников данных с API-интерфейсом по умолчанию, предоставляемым с помощью обратной связи, имея в виду, что это однопоточное приложение, так что привязка DataSource к API-интерфейсу никоим образом не должна влиять на поведение других API-интерфейсов, которые параллельно обслуживаются применение.

1 Ответ

0 голосов
/ 16 мая 2018

Отказ от ответственности: я соавтор и один из текущих сопровождающих LoopBack.

Мой совет - создать одно приложение LoopBack для каждой базы данных и написать специальное промежуточное программное обеспечение Express, которое будет направлять запросы API в нужное приложение LoopBack.

Чтобы предотвратить взаимодействие между этими экземплярами приложений для каждой базы данных, крайне важно включить недокументированный режим «локального реестра», где каждое приложение имеет свой собственный локальный реестр моделей. (По умолчанию LoopBack использует глобальный реестр моделей.)

Обратите внимание, что эта функция не используется широко, вы можете столкнуться с крайними случаями, которые не работают. Вы можете закончить отладку внутренних элементов обратной связи и посылку запроса на удаление для решения этих проблем. (Это уже случалось с одним или двумя пользователями в прошлом, поэтому большинство проблем уже должно быть исправлено.)

const app = loopback({localRegistry: true});

Приведенный выше код создаст новое приложение LoopBack, которое не имеет общего глобального состояния и не имеет настроенных встроенных моделей (без User, AccessToken и т. Д.)

Это хорошо работает для loopback-boot, который загружает именно те встроенные модели, которые настроены в server/model-config.json. Если вы загружаете модели вручную из кода, вы, вероятно, захотите предварительно загрузить все встроенные модели в ваше приложение. Это может быть достигнуто с помощью опции loadBuiltinModels:

const app = loopback({localRegistry: true, loadBuiltinModels: true});

Теперь, когда мы знаем, как создать приложение, которое не имеет общего глобального состояния, нам нужно создать реестр приложений LoopBack, по одному для каждой базы данных (это можно сделать лениво при первом доступе). Я оставлю эту часть в качестве упражнения для читателя. Единственная важная часть - это монтирование промежуточного программного обеспечения loopback.rest() на каждое приложение для базы данных, иначе мы не сможем реализовать обработку запросов позже.

const app = loopback({localRegistry: true, loadBuiltinModels: true});
app.use(loopback.rest());

Имея реестр приложений LoopBack, мы можем написать промежуточное программное обеспечение Express для обработки запросов:

function handleApiRequest(req, res, next) {
  const app = // obtain the LoopBack application instance to use
  app(req, res, next);
}

// use the middleware in your root application, e.g.
const app = express();
app.use(cors({/*...*/});
app.use(handleApiRequest);
app.use(errorHandler({/*...*/});
...