Различия между express.Router и app.get?


265

Я начинаю с NodeJS и Express 4, и я немного запутался. Я читал сайт Express, но не вижу, когда использовать обработчик маршрута или когда использовать express.Router.

Как я мог видеть, если я хочу показать страницу или что-то, когда пользователь нажимает, /showнапример, я должен использовать:

var express = require('express')    
var app = express()    
app.get("/show", someFunction)  

Вначале я думал, что это старый (для Express 3). Правильно ли это или это способ Express 4 тоже?

Если это способ сделать это в Express 4, для чего express.Routerиспользуется?

Я прочитал почти тот же пример, что и выше, но с использованием express.Router:

var express = require('express');
var router = express.Router();
router.get("/show", someFunction)

Итак, в чем разница между обоими примерами?

Какой из них мне следует использовать, если я просто хочу сделать простое тестирование сайта?


27
А Routerне .listen()для запросов самостоятельно. Это полезно для разделения приложения на несколько модулей - создавая Routerв каждом , что appможет require()и в .use()качестве промежуточного слоя.
Джонатан Лоновски

5
Как намекнул @JonathanLonowski, app.get(..)синтаксис - это просто ярлык, чтобы сделать работу с ним express.routerболее удобной. Если вы только начинаете, не беспокойтесь о специфике роутера.
soulprovidr

1
так вы говорите, что на данный момент я должен использовать только app.get ()? все еще не
понимает,

11
@ nelson687 Между ними нет строгих правил. Если вы чувствуете, что app'sсобственные методы маршрутизации, например app.get(), достаточны для ваших нужд, используйте их. Это Routerпросто для удобства, чтобы помочь вам организовать приложение по нескольким модулям. Из руководства : « Этот express.Routerкласс можно использовать для создания модульных монтируемых обработчиков маршрутов. RouterЭкземпляр представляет собой законченное промежуточное ПО и систему маршрутизации; по этой причине его часто называют« мини-приложением ». »
Джонатан Лоновски,

Ответы:


323

app.js

var express = require('express'),
    dogs    = require('./routes/dogs'),
    cats    = require('./routes/cats'),
    birds   = require('./routes/birds');

var app = express();

app.use('/dogs',  dogs);
app.use('/cats',  cats);
app.use('/birds', birds);

app.listen(3000);

dogs.js

var express = require('express');

var router = express.Router();

router.get('/', function(req, res) {
    res.send('GET handler for /dogs route.');
});

router.post('/', function(req, res) {
    res.send('POST handler for /dogs route.');
});

module.exports = router;

Когда var app = express()вызывается, объект приложения возвращается. Думайте об этом как о главном приложении .

Когда var router = express.Router()вызывается, возвращается немного другое мини-приложение . Идея мини-приложения заключается в том, что каждый маршрут в вашем приложении может быть довольно сложным, и вам будет полезно переместить весь этот код в отдельный файл. Маршрутизатор каждого файла становится мини-приложением , структура которого очень похожа на основное приложение .

В приведенном выше примере код для маршрута / dogs был перемещен в собственный файл, поэтому он не загромождает основное приложение . Код для / cats и / birds будет структурирован аналогично в их собственных файлах. Разделив этот код на три мини-приложения , вы можете работать над логикой для каждого из них в отдельности и не беспокоиться о том, как это повлияет на другие два.

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


если вам не нужно передавать объект приложения, app.use('/dogs', dogs)(app)так как вы там определяете маршруты, (и исправьте меня, если я ошибаюсь), если вы делаете это таким образом, объект приложения имеет все промежуточное программное обеспечение, ранее размещенное на нем и дополнительное промежуточное программное обеспечение будет добавлено к объекту приложения (при условии, что дополнительное промежуточное программное обеспечение находится на маршруте собак). если вы используете route.get('/dogs', route)его, то только передает промежуточное программное обеспечение объекту приложения при взаимодействии с маршрутами, определенными в этом маршрутизаторе, и если область приложения выходит за пределы маршрута, у него нет доступа к этому промежуточному программному обеспечению.
Ravenous

1
Вам не нужно передавать приложение в маршрут, потому что маршрут передается в приложение с помощью app.use('/dogs', show). Таким образом, маршрут не зависит от приложения и может быть повторно использован в любом приложении Express. Промежуточное программное обеспечение, размещенное в любом месте до того, как маршрут используется этим маршрутом. Если вы разместите промежуточное ПО над всеми маршрутами в app.js, то все промежуточные программы будут использовать это промежуточное ПО. Если вы поместите промежуточное ПО в файл маршрута (dogs.js), его будет использовать только этот маршрут. Если вы поместите промежуточное ПО после маршрута GET внутри dogs.js, то его будет использовать только POST-маршрут (если он заканчивается ответом).
Ноктюрно

Ах, мой плохой. Я хотел поставить, app.get('/dogs'dogs,)(app)так как вопрос был о функции get в app.get и route.get. Вы показали, как разделить маршруты, чтобы сделать их управляемыми. Но разве мой анакдот не будет правильным, если мы будем говорить app.get? Если я смогу войти в ПК, я отредактирую свой комментарий выше.
Ravenous

2
Мое приложение все еще работает, когда я использую или express.Router () или express (), я не мог понять разницу :(
Ajay Suwalka

3
@ Ajay Suwalka Я не знаю, как я могу более подробно остановиться на том, что я уже сказал. В документации сказано: «Объект маршрутизатора - это изолированный экземпляр промежуточного программного обеспечения и маршрутов». Мне также нравится @Jonathan Lonowski комментарий выше, "A Routerне .listen()для запросов самостоятельно". Это может быть основным отличием.
Ноктюрно

29

Экспресс 4.0 поставляется с новым маршрутизатором. Как уже упоминалось на сайте:

Класс express.Router может использоваться для создания модульных монтируемых обработчиков маршрутов. Экземпляр маршрутизатора представляет собой законченное промежуточное программное обеспечение и систему маршрутизации; по этой причине его часто называют «мини-приложением».

На https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4 есть хорошая статья, которая описывает различия и что можно сделать с маршрутизаторами.

Подвести итоги

С помощью маршрутизаторов вы можете упростить модульный код. Вы можете использовать маршрутизаторы как:

  1. Основные маршруты: Дом, О нас
  2. Направьте Middleware для регистрации запросов к консоли.
  3. Маршрут с параметрами
  4. Направьте промежуточное ПО для параметров для проверки конкретных параметров
  5. Проверяет параметр, переданный на определенный маршрут

Примечание:

app.routerОбъект, который был удален в Express 4, сделал возвращение в Экспрессе 5. В новой версии, это просто ссылка на базовый экспресс - маршрутизатор, в отличии от экспресса 3, где приложение было явно загрузить его.


7
app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Post a random book')
  })

Как и в примере выше, мы можем добавить другой метод HTTP-запроса в маршрут.


5

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

var express = require('express');
var parent = express();

И к этому родительскому приложению нам нужно ввести дочерние приложения. Но поскольку дочерние приложения не являются совершенно разными приложениями (поскольку они выполняются в одном и том же контексте context-java), Express предоставляет способ сделать это с помощью функции Router Expresse, и это то, что мы делаем в каждом файле дочернего модуля и Давайте назовем один такой дочерний модуль как aboutme .

var express = require('express');
var router = express.Router();
/**
** do something here
**/
module.exports = router;

С помощью module.exports мы делаем этот модуль доступным для использования другими, и, поскольку у нас есть модульные вещи, нам нужно сделать файлы модулей доступными для родительского приложения с помощью функции require узла, как и любые другие сторонние модули, и родительский файл выглядит что-то вроде этого.

var express = require('express') 
var parent = express() 
var child = require(./aboutme)

после того, как мы сделаем этот дочерний модуль доступным для родителя, нам нужно сообщить родительскому приложению, когда использовать это дочернее приложение. Допустим, когда пользователь выбирает путь aboutme, нам нужно, чтобы дочернее приложение обо мне обрабатывало запрос, и мы делаем это с помощью метода use Expresse .

parent.use('/aboutme',  aboutme);

и в одном кадре родительский файл выглядит так

var express = require('express');
var parent = express();
var child = require(./aboutme);
/***
**do some stuff here
**/
parent.use('/aboutme',child);

Прежде всего, что может сделать родитель, так это запустить сервер там, где ребенок не может. Надеюсь, это проясняет. Для получения дополнительной информации вы всегда можете посмотреть исходный код, который занимает некоторое время, но дает вам много информации. Спасибо.


1
не должно ли это быть parent.use('/aboutme', child)?
Кейс де Кутер

2

использование app.js для записи маршрутов означает, что они доступны всем пользователям, так как app.js загружается при запуске приложения. Однако добавление маршрутов в мини-приложения express.router () защищает и ограничивает их доступность.


2

express.Router имеет много вариантов:

  • включить чувствительность /showк регистру: маршрут не должен совпадать /Show, это поведение по умолчанию отключено
  • режим строгой маршрутизации: /show/маршрут не совпадает с /show, это поведение также отключено по умолчанию
  • мы можем добавить определенное промежуточное программное обеспечение для определенных маршрутов

0

Одним словом, express.Routerпри сравнении можно делать больше вещей app.get(), например, промежуточное ПО, более того, вы можете определить еще один объект маршрутизатора с помощьюexpress.Router()

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.