Відмінності між express.Router та app.get?


265

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

Як я бачив, якщо я хочу показати, наприклад, сторінку чи щось, коли користувач потрапляє, /showнаприклад, я повинен використовувати:

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

На початку я вважав, що це старе (для Експресу 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 ()? все ще плутається про те, коли використовувати те чи інше
nelson687

11
@ nelson687 Не існує дійсно жорсткого правила між ними. Якщо ви вважаєте, що app'sвласні методи маршрутизації, такі як app.get(), є достатніми для ваших потреб, використовуйте їх. Це Routerпросто для зручності, щоб допомогти вам організувати додаток по декількох модулях. Від керівництва : « клас може бути використаний для створення модульних монтованих оброблювачів маршрутів. Примірник є повнофункціональним проміжним шаром і система маршрутизації, з цієї причини він часто згадується як" міні-додаток ". »express.RouterRouter
Джонатан Lonowski

Відповіді:


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);

dog.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()дзвонить, повертається дещо інший міні-додаток . Ідея міні-програми полягає в тому, що кожен маршрут у вашій програмі може стати досить складним, і ви зможете перенести весь цей код в окремий файл. Роутер кожного файлу стає міні-додатком , який має дуже схожу структуру з основним додатком .

У наведеному вище прикладі код маршруту / собак переміщено у власний файл, щоб він не захаращував основну програму . Код для / кішок та / птахів буде структурований аналогічно у власних файлах. Розділивши цей код на три міні-програми , ви можете працювати над логікою кожного з них ізольовано, і не турбуватися про те, як це вплине на інші два.

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


Якщо вам не доведеться передавати об’єкт додатку, app.use('/dogs', dogs)(app)оскільки ви визначаєте маршрути туди, додатково (і виправте мене, якщо я помиляюся), якщо ви робите це таким чином, у об’єкта додатка є весь середній посуд, раніше розміщений на ньому і додатковий середній посуд буде доданий до об’єкта додатка (якщо припустити, що більше середнього посуду знаходиться в маршруті для собак). якщо ви використовуєте route.get('/dogs', route)його, лише передає середній посуд об’єкту програми під час взаємодії з маршрутами, визначеними в цьому маршрутизаторі, і якщо область застосування поза межами маршруту, він не має доступу до цього середнього обладнання.
Ворожнеча

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

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

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

3
@Ajay Suwalka Я не знаю, як я можу більше деталізувати те, що вже говорив. Документи кажуть: "Об'єкт маршрутизатора є ізольованим екземпляром програмного забезпечення та маршрутів". Мені також подобається коментар @Jonathan Lonowski вище, "A Routerне .listen()вимагає запитів самостійно". Це може бути головна відмінність.
Ноктюрно

29

Express 4.0 поставляється з новим маршрутизатором. Як згадувалося на сайті:

Клас express.Router можна використовувати для створення модульних оброблюваних маршрутизаторів. Екземпляр маршрутизатора - це повна система програмного забезпечення та маршрутизації; з цієї причини його часто називають "міні-додатком".

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

Узагальнити

За допомогою маршрутизаторів ви можете легше модулювати код. Ви можете використовувати маршрутизатори як:

  1. Основні маршрути: Головна, Про
  2. Прокладіть середнє програмне забезпечення для реєстрації запитів до консолі
  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();

І до цього батьківського додатка нам потрібно піднести дочірні додатки. Але оскільки дочірні програми не є абсолютно різними програмами (оскільки вони запускаються в одному контексті-Java-термін), express надає спосіб зробити це за допомогою функції маршрутизатора Expresse, і це те, що ми робимо у файлі кожного дочірнього модуля і дозволяє викликати один такий дочірні модуль як aboutme .

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

За допомогою module.exports ми надаємо цей модуль доступним для споживання іншим людям, і, оскільки ми модулювали речі, нам потрібно зробити доступними файли модулів для батьківського додатку за допомогою функції вимагання вузла, як і будь-які інші модулі сторонніх сторін, і батьківський файл виглядає щось на зразок цього.

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

після того, як ми зробимо цей дочірній модуль доступним для батьків, нам потрібно повідомити батьківській програмі, коли використовувати цей дочірній додаток. Скажемо, коли користувач потрапляє на шлях aboutme, нам потрібна дочірня програма про мене для обробки запиту, і ми робимо це, використовуючи метод використання 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)?
Kees de Kooter

2

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


2

express.Router є багато варіантів:

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

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.