Узел.js / Express.js-как работает приложение.маршрутизатор работает?



прежде чем я спрошу о app.router Я думаю, что я должен объяснить, по крайней мере, то, что я думаю, происходит при работе с middleware. Для использования промежуточного программного обеспечения используется функция app.use(). Когда промежуточное программное обеспечение выполняется, оно либо вызовет следующее промежуточное программное обеспечение с помощью next() или сделать так, чтобы больше не вызывалось промежуточное программное обеспечение. Это означает, что порядок, в котором я размещаю свои вызовы промежуточного программного обеспечения, важен, потому что некоторые промежуточные программы зависят от других промежуточных программ, а некоторые промежуточные программы ближе к концу могут даже не быть быть вызванным.



сегодня я работал над своим приложением и мой сервер работал в фоновом режиме. Я хотел внести некоторые изменения и обновить свою страницу и сразу увидеть изменения. В частности, я вносил изменения в макет. Я не мог заставить его работать, поэтому я искал переполнение стека для ответа и нашел этот вопрос. Он говорит, чтобы убедиться, что express.static() под require('stylus'). Но когда я смотрел на код этой операции, я увидел, что у него есть его app.router звонок в самом конце его middleware вызывает, и я попытался выяснить, почему это было.



когда я сделал свой экспресс.приложение js (версия 3.0. 0rc4), я использовал команду express app --sessions --css stylus и в мое приложение.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 в моем коде. Поэтому я прокомментировал это, запустил свое приложение и перешел к /. Он отобразил мою индексную страницу просто отлично. Хм, может быть, это сработало, потому что я экспортировал маршрут из моего файла маршрутов (routes.индекс.) Итак, далее я перешел к /test и он показал тест на экране. Ха-ха, хорошо, я понятия не имею, что app.router делает. Независимо от того, включен ли он в мой код или нет, моя маршрутизация в порядке. Так что я определенно скучаю что-то.



Так Вот Мой Вопрос:



не мог бы кто-нибудь объяснить, что app.router делает, важность этого, и где я должен поместить его в мои вызовы промежуточного программного обеспечения? Было бы также неплохо, если бы я получил краткое объяснение о express.static(). Насколько я могу судить, express.static() это кэш моей информации, и если приложение не может найти запрошенную страницу, он будет проверять кэш, чтобы увидеть, если он существует.

588   3  

3 ответов:

Примечание: это описывает, как экспресс работал в версиях 2 и 3. См. конец этого сообщения для получения информации о Express 4.


static просто подают файлы (статический ресурсы) с диска. Вы даете ему путь (иногда называемый точкой монтирования), и он обслуживает файлы в этой папке.

например, express.static('/var/www') будет служить файлы в этой папке. Так что запрос к вашему узловому серверу для http://server/file.html будет служить /var/www/file.html.

router - это код, который запускает свои маршруты. Когда вы делаете app.get('/user', function(req, res) { ... });, это router что на самом деле вызывает функцию обратного вызова для обработки запроса.

порядок, в котором вы передаете вещи app.use определяет порядок, в котором каждому промежуточному программному обеспечению предоставляется возможность обработать запрос. Например, если у вас есть файл с именем test.html в вашей статической папке и маршрут:

app.get('/test.html', function(req, res) {
    res.send('Hello from route handler');
});

который из них отправляется клиенту с запросом http://server/test.html? Какое бы промежуточное программное обеспечение ни было предоставлено use первый.

если вы сделаете это:

app.use(express.static(__dirname + '/public'));
app.use(app.router);

затем файл на диск подается.

если вы сделаете это по-другому,

app.use(app.router);
app.use(express.static(__dirname + '/public'));

затем обработчик маршрута получает запрос, и" привет от обработчика маршрута " отправляется в браузер.

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

обратите внимание, что если вы явно не use the router, он неявно добавляется Express в точке, где вы определяете маршрут (именно поэтому ваши маршруты все еще работали, даже если вы закомментировали app.use(app.router)).


комментатор имеет воспитанные еще один пункт о порядке static и router что я не рассматривал: влияние на общую производительность вашего приложения.

другая причина userouter выше static для оптимизации производительности. Если вы ставите static во-первых, то вы нажмете на жесткий диск на каждый запрос, чтобы увидеть, существует ли файл или нет. В быстрый тест, я обнаружил, что эти накладные расходы составили ~1 мс на выгруженном сервере. (Это число, скорее всего, будет выше при нагрузке, где запросы будут конкурировать за доступ к диску.)

С router во-первых, запрос, соответствующий маршруту, никогда не должен попадать на диск, сохраняя драгоценные миллисекунды.

конечно, есть способы, чтобы смягчить staticС НАКЛАДНЫМИ.

лучший вариант-поместить все ваши статические ресурсы в определенную папку. (То есть /static), то вы можете установить static на этот путь, так что он работает только тогда, когда путь начинается с /static:

app.use('/static', express.static(__dirname + '/static'));

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

вы также можете использовать staticCache, который кэширует статические ресурсы в памяти, так что вам не нужно нажимать на диск для обычно запрашиваемых файлов. (предупреждение:staticCacheвидимо быть удалены в будущем.)

однако, я не думаю staticCache кэширует отрицательные ответы (когда файл не существует), поэтому он не помогает, если вы поставили staticCache выше router без установки его на a путь.

как и все вопросы о производительности, измерьте и Проверьте свое реальное приложение (под нагрузкой), чтобы увидеть, где узкие места на самом деле.


Экспресс-4

Экспресс 4.0 выводитapp.router. Все промежуточное программное обеспечение (app.use) и маршруты (app.get и др.) обрабатываются именно в том порядке, в котором они добавляются.

другими словами:

все методы маршрутизации будут добавлены в том порядке, в котором они появляются. Вы должны не do app.use(app.router). Это устраняет наиболее распространенную проблему с Express.

другими словами, смешивая app.use() и app[VERB]() совместимость ровно в том порядке, в котором они вызываются.

app.get('/', home);
app.use('/public', require('st')(process.cwd()));
app.get('/users', users.list);
app.post('/users', users.create);

подробнее об изменениях в Express 4.

маршрутизация означает определение того, как приложение отвечает на запрос клиента к определенной конечной точке, которая является URI (или путем) и определенным методом HTTP-запроса (GET, POST и т. д.). Каждый маршрут может иметь одну или несколько функций обработчика, которые выполняются при совпадении маршрута.

в маршрутизаторе Express 4.0 нам предоставляется больше гибкости, чем когда-либо прежде, при определении наших маршрутов.

экспресс.Маршрутизатор() используется несколько раз для определения группы маршрутов.

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

маршрут используется в качестве промежуточного программного обеспечения для проверки параметров с помощью ".param ()".

приложение.route () используется в качестве ярлыка маршрутизатора для определения нескольких запросов на маршруте

когда мы, используя приложение.route (), мы прикрепляем наше приложение с этим маршрутизатором.

var express = require('express'); //used as middleware
var app = express(); //instance of express.
app.use(app.router);
app.use(express.static(__dirname + '/public')); //All Static like [css,js,images] files are coming from public folder
app.set('views',__dirname + '/views'); //To set Views
app.set('view engine', 'ejs'); //sets View-Engine as ejs
app.engine('html', require('ejs').renderFile); //actually rendering HTML files through EJS. 
app.get('/', function (req, res) {
  res.render('index');  
})
app.get('/test', function (req, res) {
  res.send('test')
})

в Express версии 4, мы можем легко определить маршруты следующим образом:

сервер.js:

const express = require('express');
const app = express();
const route = require('./route');

app.use('/route', route);
// here we pass in the imported route object

app.listen(3000, () => console.log('Example app listening on port 3000!'));

маршрут.js:

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

router.get('/specialRoute', function (req, res, next) {
     // route is now http://localhost:3000/route/specialRoute
});

router.get('/', function (req, res, next) {
    // route is now http://localhost:3000/route
});

module.exports = router;

на server.js мы импортировали объект маршрутизатора route.js файл и применить его следующим образом в server.js:

app.use('/route', route);

теперь все маршруты в route.js имеют следующую базу URL:

http://localhost:3000/route

почему такой подход:

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

Comments

    Ничего не найдено.