Хотя этот подход работает, но я бы так не делел - это как раз и создает жесткую привязку библиотеки и вызываемой функции. Тестировать это будет сложно
Как можно сделать:
1. Передавать зависимости в функцию обработчик через замыкание, например:
async handler (db) {
return (req, res, next) => {
var result = await db.query("SELECT 1 + 1 AS test");
res.send(result);
}
})
db = require('lib/db');
router.get('/', handler(db));
аналогичный же подход можно сделать с помощью объектов и классов, где передавать зависимости в конструктор, при этом надо не потерять this при передаче функции в качестве обработчика
2. ExpressJS позволяет присваивать какие-то объекты контексту ответа или контексту самого приложения.
- ответ -
expressjs.com/en/4x/api.html#res.locals
- приложение -
expressjs.com/en/4x/api.html#app.locals
3. В npm есть пакеты, которые реализовывают DI, но тут ничего не могу порекомендовать - не пользовался.
Можно делать так, но это не совсем очевидно