Express промежуточное программное обеспечение подключено не для каждого экземпляра маршрутизатора, а для каждого пути. Поскольку я не указывал путь, мой вызов _router.use(middleware);
был привязан к промежуточному программному обеспечению ко всем путям. И поскольку я вызывал это в цикле, я просто добавлял одно и то же промежуточное ПО несколько раз ко всем путям.
Чтобы исправить это и получить преимущества динамического запроса отдельных файлов маршрутизатора, я внес некоторые изменения в свой код.
Прежде всего, я добавил небольшой объект «метаданных» в каждый из файлов роутера. У него есть два поля. Один содержит «префикс маршрута» (путь, с которого начинается каждый из маршрутов в файле) и что-то, что говорит о необходимости авторизации маршрутов в этом файле (мое промежуточное ПО выполняет авторизацию).
Затем я экспортирую и маршрутизатор, и метаданные из этого файла маршрутизатора.
Теперь вернемся к моему файлу `/routes/index.js '...
Там я все еще динамически запрашиваю все индивидуальные маршруты и прикрепляю промежуточное программное обеспечение. Однако я использую метаданные маршрутизатора для подключения маршрутизатора с использованием его префикса, поэтому я не применяю промежуточное ПО к одним и тем же путям маршрутов снова и снова.
/routes/index.js
const fs = require('fs');
const path = require('path');
const auth_service = require('./../utils/auth_service');
var express = require('express');
var MetaRouter = express.Router();
// collect all of the legitimate router files
const files = fs.readdirSync(__dirname).filter(file => file !== 'index.js');
// pull in each "child" router, attach it to the "meta router" and apply middleware
files.forEach(file => {
const { name } = path.parse(file);
_router = require(`./${name}`);
MetaRouter.use(_router.router_metadata.endpoint_prefix, auth_service.auth_middleware(_router.router_metadata), _router.router);
});
module.exports = MetaRouter;
один из моих файлов роутера
const BoxRequestService = require("../services/request/box_request_service.js");
var express = require('express');
var router = express.Router();
const router_metadata = {
endpoint_prefix: '/box',
requires_auth: true
}
router.get('/:id',
async function (req, res) {
res.json(await BoxRequestService.findById(req, res));
}
);
router.put('/:id',
async function (req, res) {
res.json(await BoxRequestService.update(req, res));
});
router.post('/', async function (req, res) {
res.json(await BoxRequestService.create(req, res));
});
router.get('/',
async function (req, res) {
res.json(await BoxRequestService.getAll(req, res));
});
module.exports = { router, router_metadata };
И вот где я определяю промежуточное ПО
Здесь я использую метаданные маршрутизатора, чтобы определить, должно ли промежуточное ПО применяться к его путям.
var passport = require('passport');
require('../config/passport')(passport);
let self = module.exports = {
auth_middleware: function(router_metadata){
return function (req, res, next) {
if (router_metadata.requires_auth) {
passport.authenticate('jwt', { session: false }, function (err, user, info) {
if (err) { return next(err); }
if (!user) {
res.status("401");
return res.send("Unauthorized").end();
}
req.user = user;
next();
})(req, res, next);
} else {
next();
}
}
}
}