Я начинаю с 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)
Итак, в чем разница между обоими примерами?
Какой из них мне следует использовать, если я просто хочу сделать простое тестирование сайта?
Router
не.listen()
для запросов самостоятельно. Это полезно для разделения приложения на несколько модулей - создаваяRouter
в каждом , чтоapp
можетrequire()
и в.use()
качестве промежуточного слоя.app.get(..)
синтаксис - это просто ярлык, чтобы сделать работу с нимexpress.router
более удобной. Если вы только начинаете, не беспокойтесь о специфике роутера.app's
собственные методы маршрутизации, напримерapp.get()
, достаточны для ваших нужд, используйте их. ЭтоRouter
просто для удобства, чтобы помочь вам организовать приложение по нескольким модулям. Из руководства : « Этотexpress.Router
класс можно использовать для создания модульных монтируемых обработчиков маршрутов.Router
Экземпляр представляет собой законченное промежуточное ПО и систему маршрутизации; по этой причине его часто называют« мини-приложением ». »Ответы:
app.js
dogs.js
Когда
var app = express()
вызывается, объект приложения возвращается. Думайте об этом как о главном приложении .Когда
var router = express.Router()
вызывается, возвращается немного другое мини-приложение . Идея мини-приложения заключается в том, что каждый маршрут в вашем приложении может быть довольно сложным, и вам будет полезно переместить весь этот код в отдельный файл. Маршрутизатор каждого файла становится мини-приложением , структура которого очень похожа на основное приложение .В приведенном выше примере код для маршрута / dogs был перемещен в собственный файл, поэтому он не загромождает основное приложение . Код для / cats и / birds будет структурирован аналогично в их собственных файлах. Разделив этот код на три мини-приложения , вы можете работать над логикой для каждого из них в отдельности и не беспокоиться о том, как это повлияет на другие два.
Если у вас есть код (промежуточное программное обеспечение), который относится ко всем трем маршрутам, вы можете поместить его в основное приложение перед
app.use(...)
вызовами. Если у вас есть код (промежуточное программное обеспечение), который относится только к одному из этих маршрутов, вы можете поместить его в файл только для этого маршрута.источник
app.use('/dogs', dogs)(app)
так как вы там определяете маршруты, (и исправьте меня, если я ошибаюсь), если вы делаете это таким образом, объект приложения имеет все промежуточное программное обеспечение, ранее размещенное на нем и дополнительное промежуточное программное обеспечение будет добавлено к объекту приложения (при условии, что дополнительное промежуточное программное обеспечение находится на маршруте собак). если вы используетеroute.get('/dogs', route)
его, то только передает промежуточное программное обеспечение объекту приложения при взаимодействии с маршрутами, определенными в этом маршрутизаторе, и если область приложения выходит за пределы маршрута, у него нет доступа к этому промежуточному программному обеспечению.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
? Если я смогу войти в ПК, я отредактирую свой комментарий выше.Router
не.listen()
для запросов самостоятельно". Это может быть основным отличием.Экспресс 4.0 поставляется с новым маршрутизатором. Как уже упоминалось на сайте:
На https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4 есть хорошая статья, которая описывает различия и что можно сделать с маршрутизаторами.
Подвести итоги
С помощью маршрутизаторов вы можете упростить модульный код. Вы можете использовать маршрутизаторы как:
Примечание:
app.router
Объект, который был удален в Express 4, сделал возвращение в Экспрессе 5. В новой версии, это просто ссылка на базовый экспресс - маршрутизатор, в отличии от экспресса 3, где приложение было явно загрузить его.источник
Как и в примере выше, мы можем добавить другой метод HTTP-запроса в маршрут.
источник
Допустим, ваше приложение немного сложное. Поэтому сначала мы делим приложение на несколько модулей, чтобы изменения в одном модуле не загромождали другие, и вы могли продолжать работу над отдельными модулями, но в конце дня вам необходимо интегрировать все в один, поскольку вы строим одно приложение. Это похоже на то, что у нас есть одно основное приложение и несколько дочерних приложений, чьим родителем является основное приложение. Поэтому, когда мы создаем родительское приложение, мы создаем его, используя
И к этому родительскому приложению нам нужно ввести дочерние приложения. Но поскольку дочерние приложения не являются совершенно разными приложениями (поскольку они выполняются в одном и том же контексте context-java), Express предоставляет способ сделать это с помощью функции Router Expresse, и это то, что мы делаем в каждом файле дочернего модуля и Давайте назовем один такой дочерний модуль как aboutme .
С помощью module.exports мы делаем этот модуль доступным для использования другими, и, поскольку у нас есть модульные вещи, нам нужно сделать файлы модулей доступными для родительского приложения с помощью функции require узла, как и любые другие сторонние модули, и родительский файл выглядит что-то вроде этого.
после того, как мы сделаем этот дочерний модуль доступным для родителя, нам нужно сообщить родительскому приложению, когда использовать это дочернее приложение. Допустим, когда пользователь выбирает путь aboutme, нам нужно, чтобы дочернее приложение обо мне обрабатывало запрос, и мы делаем это с помощью метода use Expresse .
и в одном кадре родительский файл выглядит так
Прежде всего, что может сделать родитель, так это запустить сервер там, где ребенок не может. Надеюсь, это проясняет. Для получения дополнительной информации вы всегда можете посмотреть исходный код, который занимает некоторое время, но дает вам много информации. Спасибо.
источник
parent.use('/aboutme', child)
?использование app.js для записи маршрутов означает, что они доступны всем пользователям, так как app.js загружается при запуске приложения. Однако добавление маршрутов в мини-приложения express.router () защищает и ограничивает их доступность.
источник
express.Router
имеет много вариантов:/show
к регистру: маршрут не должен совпадать/Show
, это поведение по умолчанию отключено/show/
маршрут не совпадает с/show
, это поведение также отключено по умолчаниюисточник
Одним словом,
express.Router
при сравнении можно делать больше вещейapp.get()
, например, промежуточное ПО, более того, вы можете определить еще один объект маршрутизатора с помощьюexpress.Router()
источник