Прежде чем спросить об этом, app.router
я должен объяснить, по крайней мере, что, по моему мнению, происходит при работе с промежуточным программным обеспечением. Чтобы использовать промежуточное ПО, нужно использовать функцию app.use()
. Когда промежуточное программное обеспечение выполняется, оно будет вызывать следующее промежуточное программное обеспечение с помощью next()
или делать так, чтобы промежуточное программное обеспечение больше не вызывалось. Это означает, что порядок, в котором я размещаю свои вызовы промежуточного программного обеспечения, важен, потому что некоторое промежуточное программное обеспечение зависит от другого промежуточного программного обеспечения, а некоторое промежуточное программное обеспечение ближе к концу может даже не вызываться.
Сегодня я работал над своим приложением, и мой сервер работал в фоновом режиме. Я хотел внести некоторые изменения, обновить страницу и сразу же увидеть изменения. В частности, я вносил изменения в свой макет. Я не смог заставить его работать, поэтому я искал Stack Overflow для ответа и нашел этот вопрос . Он говорит, чтобы убедиться, что express.static()
это ниже require('stylus')
. Но когда я смотрел на код этого OP, я увидел, что его app.router
звонок был в самом конце его вызовов промежуточного программного обеспечения, и я попытался выяснить, почему это было.
Когда я сделал свое заявление Express.js (версия 3.0.0rc4), я использовал команду express app --sessions --css stylus
и подать мой app.js код пришел настройки с моим app.router
выше как express.static()
и require('stylus')
звонками. Таким образом, кажется, что если он уже настроен таким образом, он должен оставаться таким.
После реорганизации моего кода, чтобы я мог видеть изменения моего Стилуса, это выглядит так:
app.configure(function(){
//app.set() calls
//app.use() calls
//...
app.use(app.router);
app.use(require('stylus').middleware(__dirname + '/public'));
app.use(express.static(__dirname + '/public', {maxAge: 31557600000}));
});
app.get('/', routes.index);
app.get('/test', function(req, res){
res.send('Test');
});
Поэтому я решил, что первым шагом будет выяснить, почему это важно даже app.router
в моем коде. Поэтому я прокомментировал это, запустил свое приложение и перешел к /
. Он показал мою страницу индекса просто отлично. Хм, может быть, это сработало, потому что я экспортировал маршрутизацию из моего файла маршрутов (rout.index). Затем я перешел к /test
пункту «Тест» на экране. Хаха, хорошо, я понятия не имею, что app.router
делает. Включено ли это в мой код или нет, моя маршрутизация в порядке. Так что я определенно что-то упускаю.
Вот мой вопрос:
Может кто-нибудь объяснить, что app.router
делает, важность этого и где я должен поместить это в мои вызовы промежуточного программного обеспечения? Было бы также хорошо, если бы я получил краткое объяснение express.static()
. Насколько я могу судить, express.static()
это кэш моей информации, и если приложение не может найти запрошенную страницу, оно проверит кеш, чтобы узнать, существует ли оно.
источник
Ответы:
Примечание. Здесь описывается, как Express работал в версиях 2 и 3. Информацию о Express 4 см. В конце этого поста.
static
просто обслуживает файлы ( статические ресурсы) с диска. Вы даете ему путь (иногда называемый точкой монтирования), и он обслуживает файлы в этой папке.Например,
express.static('/var/www')
будет обслуживать файлы в этой папке. Таким образом, запрос на ваш сервер Nodehttp://server/file.html
будет обслуживать/var/www/file.html
.router
это код, который запускает ваши маршруты. Когда вы это делаетеapp.get('/user', function(req, res) { ... });
, это именно то,router
что на самом деле вызывает функцию обратного вызова для обработки запроса.Порядок передачи вещей
app.use
определяет порядок, в котором каждому промежуточному ПО предоставляется возможность обрабатывать запрос. Например, если у вас есть файл с именемtest.html
в вашей статической папке и маршрут:Какой из них отправляется клиенту с запросом
http://server/test.html
? Какое бы промежуточное программное обеспечение было предоставленоuse
первым.Если вы делаете это:
Затем файл на диске подается.
Если вы делаете это по-другому,
Затем обработчик маршрута получает запрос, и «Привет из обработчика маршрута» отправляется в браузер.
Обычно вы хотите поместить маршрутизатор выше статического промежуточного программного обеспечения, чтобы случайно названный файл не мог переопределить один из ваших маршрутов.
Обратите внимание , что если вы явно не , он неявно добавляется курьерским в точке вы определяете маршрут (который почему ваши маршруты все еще работали , даже если вы закомментировать ).
use
router
app.use(app.router)
Комментатор был воспитан еще один пункт о порядке
static
иrouter
что я не имел имя: влияние на общую производительность вашего приложения.Еще одна причина
use
router
вышеstatic
- оптимизировать производительность. Если поставитьstatic
первым, то при каждом запросе вы будете нажимать на жесткий диск, чтобы увидеть, существует ли файл. В быстром тесте я обнаружил, что на незагруженном сервере эти издержки составили ~ 1 мс. (Скорее всего, это число будет выше при загрузке, когда запросы будут конкурировать за доступ к диску.)Во-
router
первых, запрос, соответствующий маршруту, никогда не должен попадать на диск, экономя драгоценные миллисекунды.Конечно, есть способы уменьшить
static
накладные расходы.Лучший вариант - поместить все ваши статические ресурсы в определенную папку. (IE
/static
) Затем вы можете подключитьсяstatic
к этому пути, чтобы он работал только тогда, когда путь начинается с/static
:В этой ситуации вы бы поставили это выше
router
. Это позволяет избежать обработки другого промежуточного программного обеспечения / маршрутизатора, если файл присутствует, но, честно говоря, я сомневаюсь, что вы получите так много.Вы также можете использовать
staticCache
, который кэширует статические ресурсы в памяти, так что вам не нужно нажимать на диск для часто запрашиваемых файлов. ( Предупреждение:staticCache
очевидно, будет удалено в будущем.)Тем не менее, я не думаю, что
staticCache
кэширует отрицательные ответы (когда файл не существует), поэтому не поможет, если вы поставилиstaticCache
выше,router
не подключив его к пути.Как и в случае со всеми вопросами о производительности, измерьте и сравните свое реальное приложение (под нагрузкой), чтобы увидеть, где на самом деле существуют узкие места.
Экспресс 4
Экспресс 4.0 удаляет
app.router
. Все middleware (app.use
) и маршруты (app.get
и др.) Теперь обрабатываются именно в том порядке, в котором они были добавлены.Другими словами:
Узнайте больше об изменениях в Express 4.
источник
router
идет в одном месте. Если в первый раз вы называетеapp.get
(илиpost
или другие), вы еще неuse
dapp.router
, Экспресс добавляет это для вас.static
AFTERrouter
, вопрос о другом промежуточном слое становится неуместным , поскольку она должна быть выше маршрутизатора.app.router
будет удален в текущей основной ветви, который будет экспресс-4.0 . Каждый маршрут становится отдельным промежуточным ПО.источник
В экспресс-версии 4 мы можем легко определить маршруты следующим образом:
server.js:
route.js:
В
server.js
мы импортировали объект маршрутизатора изroute.js
файла и применять его следующим образом вserver.js
:Теперь все маршруты
route.js
имеют следующий базовый URL:HTTP: // локальный: 3000 / маршрута
Почему этот подход:
Основным преимуществом такого подхода является то, что теперь наше приложение стало более модульным . Все обработчики маршрута для определенного маршрута теперь могут быть помещены в разные файлы, что делает все более удобным для обслуживания и более простым для поиска.
источник