Функциональный подход
Я думаю, что хорошей структурой для этого является попытка карри вашего промежуточного программного обеспечения. Это паттерн, применяемый промежуточным программным обеспечением, таким как body-parser
и внутренним выражением самого Express с serve-static
. Таким образом, вам нужно всего лишь один раз и передать db
, где вам нужно, и не делать, где вам это не нужно:
// Instead of declaring each function directly as a middleware function,
// we declare them as a function that returns a middleware function
function doesNotNeedDbParam () {
return function (req, res, next) {
…
}
}
function needsDbParam (db) {
return function (req, res, next) {
// You can use db here along with req, res, next
}
}
// No need to export a function now
module.exports = {
doesNotNeedDbParam,
needDbParam,
};
Тогда просто потребуйте:
const middleware = require('./middleware');
…
router.use(middleware.doesNotNeedDbParam()); // Since this doesn't need anything, no argument
router.use(middleware.needsDbParam(db)); // You can pass db here now
Если вы знакомы с синтаксисом ES6 +, вы можете сжать до:
const doesNotNeedDbParam = () => (req, res, next) => {
…
}
const needsDbParam = (db) => (req, res, next) => {
// Use db here
}
// Export object here...
Тогда:
const { doesNotNeedDbParam, needsDbParam } = require('./middleware');
…
router.use(doesNotNeedDbParam());
router.use(needsDbParam(db));
Присоединить подход
Есть и другой способ сделать это, прикрепив свойство к req
объекту один раз . Это устраняет необходимость повторного ввода db
каждый раз, когда вы этого хотите. Многие другие пакеты используют эту стратегию. Это выглядит примерно так:
function attachDb (db) { // Still use curry approach here since we want db
return function (req, res, next) {
// Attaches the specified db to req directly
req.db = db;
}
}
function needsDbParam (req, res, next) { // No need for currying
// Now use req.db here
}
// Export your other middleware…
Затем используйте его следующим образом, убедитесь, что attachDb
- это first , чтобы свойство было назначено перед его использованием:
router.use(attachDb(db)); // Before all other middleware that depend on req.db
…
// No need to call because this is already the middleware function,
// able to use req.db, which was assigned via attachDb
router.use(needDbParam);