У меня есть API в ExpressJS и промежуточное ПО, которое запускается перед каждым контроллером конечной точки:
app.use(segregationMiddleware);
app.get('/some-endpoint', controller1);
app.get('/some-endpoint-2', controller2);
segregationMiddleware
используется для поиска некоторых параметров в запросе, а затем он вычисляет значение, которое затем сохраняется в объекте запроса как req.locals.domain
, чтобы контроллеры могли получить к нему доступ.
В каждой модели Mon goose я определяю поле с именем domain
, используя Mon goose плагин (так что мне не нужно делать это каждый раз). Это поле используется для разделения моих активов. Это означает, что когда segregationMiddleware
заполняет, например, req.locals.domain = 'foo'
, если я создаю model.find({})
, я хочу получить только активы, у которых есть { domain: 'foo' }
. То же самое, если я попытаюсь обновить, сохранить, удалить и т. Д.
Конечно, я могу просто изменить запрос на каждом контроллере, поскольку у меня есть доступ к req
, но мне нужно делать это каждый раз время, и мне нужно запомнить его для находок, findAndUpdate, save и так далее ... рано или поздно я это забуду.
Я могу определить некоторые хуки в Mon goose, которые изменят запрос используя плагин, поэтому он добавляет ограничение domain
в запрос, поэтому мне не нужно делать это в контроллере, НО у меня нет текущего объекта req
в плагине Mon goose, если я не передам его, и единственный способ, который приходит мне в голову, - это абстрагировать методы БД в плагине, поэтому в контроллере я делаю что-то вроде этого:
model.safeFind(req, query);
А в плагине я определяю safeFind
как:
safeFind = () => {
const theRealQuery = Object.assign({}, query, { domain: req.locals.domain });
return this.find(query);
}
НО, таким образом, мне нужно переопределить каждую функцию запроса к БД (найти, найти, обновить, сохранить ...), и мне нужно не забыть использовать безопасные методы. Опять же, я рано или поздно забуду об этом.
Есть ли способ, которым я все еще могу использовать обычные методы Mon goose из контроллера и заставить плагин каким-то образом изменять запрос для каждого метода, используя текущий req
объект?