Nodejs: промежуточное ПО для загрузки только страниц

1

Я работаю с шаблонами nodejs и ejs. Я хочу установить промежуточное программное обеспечение, которое будет вызываться только при загрузке страницы, а не при отправке запроса из кода.

Пример:

app.use(function(req, res, next){
    if(req.session){
        console.log("OKAY");
    } 
    next();
});

Я хочу, чтобы этот журнал отображался только при загрузке страницы, а не при отправке запроса из кода, как показано ниже.

$.get( "/users", function( data ) {
    console.log(data);
});

Как я могу это сделать?

Спасибо

Теги:
express

2 ответа

3
Лучший ответ

У вас есть несколько вариантов:

  1. В промежуточном программном обеспечении вы можете проверить req.path, чтобы узнать, является ли это путь, к которому вы должны применить промежуточное программное обеспечение, или использовать его, if в вашем средстве middl для просто вызова next() без каких-либо действий или для выполнения любого промежуточного программного обеспечения сделать.

  2. Вы можете настроить маршруты на эти маршруты страниц, а маршруты ajax находятся на разных путях, а затем спроектируйте маршрутизатор для маршрутов страниц и маршрутизатор для маршрутов ajax и установите промежуточное программное обеспечение только на маршрутизаторе страницы.

Это действительно поможет вам (с любым вариантом выше), если вы разрабатываете свои URL-адреса, чтобы ваш сервер мог различать, является ли это URL-адрес, который должен или не должен иметь промежуточное ПО. Как правило, самый простой способ сделать это - использовать известный префикс на одной или обеих ветвях вашего дизайна URL. Например, все URL-адреса ajax могут начинаться с /api а затем вы можете легко отключить все вызовы API на специальный маршрутизатор, а все другие URL-адреса - это не-API-URL (вероятно, URL-адреса страниц).

Здесь приведен пример отдельного маршрутизатора API:

// split off all API calls to a separate router
let apiRouter = express.Router();
app.use('/api', apiRouter);

// handle /api/users
apiRouter.get('/users', handleUserAjaxRequest);

// handle all other /api/xxx routes that don't have their own handler
apiRouter.use(function(req, res, next) {
    // if /api request not handled by here, then don't allow it to propagate further
    // it must be a invalid /api/xxx URL, so do a 404
    res.status(404).end();
});

// this won't get called if there a /api/xxx URL because that will have
// already been handled by the apiRouter
app.use(someMiddleware);

app.get('/somepage', handleSomePageURL);

Вы также можете использовать отдельный маршрутизатор для всех запросов на страницу, что может сделать модульность чище со всеми маршрутами API в одном модуле и всеми маршрутами страниц в другом модуле, каждый из которых экспортирует собственный маршрутизатор.

  • 0
    Спасибо. Я видел req.xhr по вашей ссылке, и он лучше для моего маленького проекта nodejs. Но, конечно, я буду управлять своими будущими большими проектами nodejs, как вы объясните во втором варианте;)
0

Я использую JQuery для отправки запроса от клиента, и я видел из ссылки jfriend00, что req.xhr возвращает свойство Boolean, которое является истинным, если запросы заголовка X-Requested-With являются "XMLHttpRequest", что указывает на то, что запрос был выдан клиентской библиотеки, такой как jQuery.

app.use(function(req, res, next){
    if(req.xhr){
        console.log("FROM CLIENT LIBRARY");
    } 
    next();
});

Спасибо, jfriend00

  • 1
    Я действительно думаю, что лучше просто спроектировать свои URL-адреса, чтобы URL-адреса API отличались от URL-адресов страниц простым и понятным способом. Это намного более расширяемо и управляет вещами по фактической функции, а не по какому-либо флагу, который клиент может установить или не установить.
  • 0
    Да, ты прав. Промежуточное программное обеспечение вызывается много раз при загрузке страницы, и это не хорошо, потому что я много раз запрашиваю его. Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню