Я работаю с шаблонами nodejs и ejs. Я хочу установить промежуточное программное обеспечение, которое будет вызываться только при загрузке страницы, а не при отправке запроса из кода.
Пример:
app.use(function(req, res, next){
if(req.session){
console.log("OKAY");
}
next();
});
Я хочу, чтобы этот журнал отображался только при загрузке страницы, а не при отправке запроса из кода, как показано ниже.
$.get( "/users", function( data ) {
console.log(data);
});
Как я могу это сделать?
Спасибо
У вас есть несколько вариантов:
В промежуточном программном обеспечении вы можете проверить req.path, чтобы узнать, является ли это путь, к которому вы должны применить промежуточное программное обеспечение, или использовать его, if
в вашем средстве middl для просто вызова next()
без каких-либо действий или для выполнения любого промежуточного программного обеспечения сделать.
Вы можете настроить маршруты на эти маршруты страниц, а маршруты 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 в одном модуле и всеми маршрутами страниц в другом модуле, каждый из которых экспортирует собственный маршрутизатор.
Я использую 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