Да, вы можете использовать middleware
.
Промежуточное программное обеспечение - это функция, которую вы можете передать до или после выполняемой основной функции (в данном случае GET comments
)
порядок расположения функции имеет значение, но стоит на первом месте - сначала выполняется, и вы реализуете его следующим образом:
app.use(myBrowsingRestrictionMiddlewareFunction) // Runs
app.use('/comments', commentsRouter);
app.use('/account', accountRouter);
Вы также можете использовать в route handler
:
app.post('/comments', myMakeSureDataIsAlrightFunction, myMainCreateCommentFunction, myAfterStatusWasSentToClientAndIWishToMakeAnotherInternalActionMiddleware);
Свойства req, res, next
передаются в функцию автоматически.
, что означает, что myBrowsingRestrictionMiddlewareFunction
получает их, и вы можете использовать их следующим образом:
export function myBrowsingRestrictionMiddlewareFunction(req, res, next) {
if (req.headers['my-special-header']) {
// custom header exists, then call next() to pass to the next function
next();
} else {
res.sendStatus(403);
}
}
EDIT
В отношении того, где разместить промежуточное программное обеспечение в структуре FS (личное предложение):
Мне нравится отделять маршрутизатор от app.js следующим образом:
app.js
app.use('/', mainRouter);
router.js
const router = express.Router();
router.use(middlewareForAllRoutes);
router.use('/comments', commentsRouter);
router.use(middlewareForOnlyAnyRouteBelow);
router.use('/account', accountRouter);
router.use(middlewareThatWillBeFiredLast); // To activate this, remember to call next(); on the last function handler in your route.
commentsRouter.js
const router = express.Router();
router.use(middlewareForAllRoutesONLYFORWithinAccountRoute);
route.get('/', middlewareOnlyForGETAccountRoute, getAccountFunction);
router.post('/', createAccount);