Express routing - предотвращает выполнение промежуточного программного обеспечения верхнего уровня app.use ('/') при непосредственном посещении дочерних / вложенных путей - PullRequest
1 голос
/ 06 января 2020

Так что я не совсем уверен, достаточно ли описательный заголовок, но вот очень простой пример.

Мой сайт имеет общедоступную c область и ограниченную область администратора.

example.com/admin (домашняя страница администратора)
example.com/admin/news (страница новостей)
example.com/admin/posts (страница сообщений)

И потому что я не хочу, чтобы люди не были администраторами или вошел в систему, чтобы получить доступ к нему, у меня есть простая функция промежуточного программного обеспечения для проверки файлов cookie.

приложение. js

const express = require('express');
const app = express();

const authMiddleWere = async (req, res, next) => {
    // pseudo-code, do some cookie validity check here
    console.log(`Route: ${req.url}`)
    if (cookie) {
         next();
    }
};

const adminRouter = require('./routes/private/home');
const newsRouter = require('./routes/private/news');
const postsRouter = require('./routes/private/posts');

app.use('/admin/', authMiddleWere, adminRouter);
app.use('/admin/news', authMiddleWere, newsRouter);
app.use('/admin/posts', authMiddleWere, postsRouter);

/ маршруты / частные / домашние. js

const express = require('express');
const router = express.Router();

router.get('/', async (req, res, err) => {
    res.render('private/home');
});

module.exports = router;

Проблема здесь в том, что эта функция authMiddleWere вызывается дважды, когда я посещаю вложенные пути, такие как example.com/admin/news, которые используют один и тот же шаблон - это начинается с /admin/......

Я могу сказать это наверняка, потому что мы регистрируем req.url в нашей функции промежуточного программного обеспечения, поэтому, если я go до example.com/admin, он выйдет из системы:

Route: /

Но если я go до example.com/admin/news, он выйдет из системы:

Route: /
Route: /news

Так что вызывает это и как мне обойти это? Я предполагаю, что то, что я описал, является предполагаемым поведением Express. js, поэтому я ищу способ обойти это или (ре) структурировать мой код лучше.

Cheers!

Ответы [ 2 ]

1 голос
/ 07 января 2020

Вы можете использовать регулярное выражение для вашего маршрута.

app.use(/\/admin$/, authMiddlewear, authRouter);

Это будет соответствовать только маршрутам, которые заканчиваются на admin. Возможно, вам придется обрабатывать случаи, когда маршрут /admin/ вместо /admin, но iir c, express обрабатывает это с умом.

1 голос
/ 06 января 2020

Ну, один из способов исправить это, создав отдельный файл route и разделив все на MVC. Например:

  1. Внутри вашего основного приложения. js просто создайте маршрут, указывающий на /admin, вот так:

    app.use('/admin', authMiddleWere, require('./src/your-route-to-the-file/admin.route'));

  2. Внутри файла admin.route позвоните своему контроллеру следующим образом:

    const express = require("express");
    const router = express.Router();
    
    const mainAdminCtrl = require("../controllers/admin.controller");
    
    router.get("/news", mainAdminCtrl.adminAuthDisplay);
    
    module.exports = router;
    

Где const mainAdminCtrl - это ваш контроллер, а функция adminAuthDisplay - это ваша служба.

По сути, вы разделяете свои функции на выделенный файл router, controller и service. Поэтому, когда вы пытаетесь получить доступ к маршруту /admin, он будет искать любой суффикс в файле router.

В случае, если вы хотите получить доступ к конечной точке /news, ваш API будет только делать вызов один раз.

Если это поможет, я могу расширить свое объяснение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...