«Вы не можете смотреть, куда идете, если не знаете, куда идете!» - Хламница, Лабиринт

Навигация по веб-сайту или создание правильного набора конечных точек URL, чтобы добраться туда, куда вы идете (или получить информацию, которую вы ищете), должно быть легким, но только если мастер лабиринта — гм, извините меня — если кодер на самом деле хочет, чтобы вы получили правильную информацию или попали на нужную веб-страницу.

Хотя мне очень хотелось бы жить в мире, наполненном марионетками Джима Хенсона, блестящими фонами и Дэвидом Боуи, распевающим мне песню, увы, я хочу, чтобы миры, которые я создаю, были менее напряженными для пользователя, а не более. Вот почему Express.js — это серверная платформа, с которой мы сегодня будем работать.

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

Boilerplate (Как попасть в Лабиринт)

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

const express = require('express');
const app = express();

app.listen(3000, () => {
    console.log("Server is running on 3000")
});

Как только это заработает, вы можете начать выполнять простую маршрутизацию.

Методы маршрутизации (иногда путь вперед — это путь назад)

Ваши данные должны идти в правильном направлении в зависимости от ваших целей. Методы маршрута происходят из методов HTTP, но специально для этого контекста:

  • ПОЛУЧИТЬ: это получает данные, откуда ваш сервер или вызов API
  • POST: это отправляет данные на ваш сервер
  • УДАЛИТЬ: это удалит то, что вы укажете
  • PUT: аналогично POST, но чаще для обновления, чем для создания

Это самые распространенные, но Express также поддерживает: извлечение, копирование, заголовок, блокировка, слияние, mkactivity, mkcol, перемещение, m-поиск, уведомление, параметры, исправление, очистка, отчет, поиск, подписка, отследить, разблокировать, отписаться.

Ваш код будет следовать следующей формуле: app.METHOD(путь, обратный вызов).

Обратный вызов должен иметь «req» и ​​«res» (в таком порядке!) И, возможно, иметь «next», если это промежуточное ПО (но это для комнаты с перевернутой лестницей, мы не беспокоимся об этом здесь). Вот так:

app.get("/", (req, res) => {
    res.send("'Ello! Come inside and meet the missus");
});

Это очень простой маршрут, в значительной степени полезный для тестирования и проверки правильности работы. Если вы зайдете на localhost3000/, вы должны найти свое приветственное сообщение в том виде, в котором оно было отправлено в ответ.

Пути (Куда ты хочешь пойти? Мммм?)

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

Строка на основе:

// this will only take you to requests exactly matching 
app.get('/bogofeternalstench', (req, res) => {
  res.send('bogofeternalstench')
})

// this will take you to the root route
app.get('/', (req, res) => {
  res.send('root')
})

Строчные узоры:

// if the user types acd or abcd, they will still get to the right place 
app.get('/ab?cd', (req, res) => {
  res.send('ab?cd')
})

// the user can add as many 'b's as their heart desires 
// abcd, abbcd, abbbbbbbbbcd will all take them to the right place
app.get('/ab+cd', (req, res) => {
  res.send('ab+cd')
})

// as wild as a Wild Thing, the asteriks (*) means anything can be typed
// abcd, abxcd, abRANDOMcd, ab123cd, abCHILLDYDOWNcd,
app.get('/ab*cd', (req, res) => {
  res.send('ab*cd')
})

// just as iffy as Hoggle's friendship, cd can either be there or not
app.get('/ab(cd)?e', (req, res) => {
  res.send('ab(cd)?e')
})

Обычные выражения:

//This request will match anything with an p in it
// p for peach because I couldn't help myself 

app.get(/p/, (req, res) => {
  res.send('/p/')
})

// the wildcard at the beginning means any word can happen before 'fly'
// and that dollar sign stops the end from having anything
// So, this route path will match butterfly and dragonfly, but not butterflyman, dragonflyman, and so on.
app.get(/.*fly$/, (req, res) => {
  res.send('/.*fly$/')
})

Большая часть кода из этого раздела была сымитирована или взята прямо из Руководства по маршрутизации Express.js, пожалуйста, посмотрите еще больше примеров.

Помните о порядке, в котором вы укладываете эти пути — они будут читаться по порядку. Если у вас есть путь «/», следуйте ему по жестко запрограммированным путям, а затем. . . вы можете поставить некоторые конечные точки!

Конечные точки (Стучите, и дверь может открыться)

Эти пути являются конкретными запросами, связанными с вашей базой данных — вы создаете параметры запроса! Они будут напрямую связаны с вашей базой данных, но я предоставлю пример кода, который может просветить вас в возможностях.

// another stellar sample from ExpressJs's own website, so check that out
Route path: /users/:userId/books/:bookId
Request URL: http://localhost:3000/users/34/books/8989
req.params: { "userId": "34", "bookId": "8989" }

// my silly attempt to remember it better by adding Labyrinth characters
Route path: /runners/:runnerId/takenobject/:objectId
Request URL: http://localhost:3000/runners/sarah/takenobject/babytoby
req.params: { "runnerId": "sarah", "takenobject": "babytoby" }

Маршрутизация для вышеуказанного может выглядеть так:

app.get('/users/:userId/books/:bookId', (req, res) => {
  res.send(req.params)
})

app.get('/runners/:runnerId/takenobject/:objectId', (req, res) => {
  res.send(req.params)
})

Сохраняйте имя пути в виде символов слова ([A-Za-z0–9_]), иначе вас отправят в Болото Вечной Смрады (т.е. ваш код будет работать некорректно).

Route() и Router() (Если мы вам понадобимся...)

Пришло время держаться за руки с друзьями через жуткий лес, иначе Король гоблинов полностью разделит вас (ака, сэкономьте себе время, объединив обработчики маршрутов в цепочку!).

Вы можете объединить запросы и ответы, если они имеют один и тот же путь маршрута с помощью app.route(). Это помогает сократить объем кода и оставляет меньше места для ошибок!

// An example from Express Js themselves 
app.route('/book')
  .get((req, res) => {
    res.send('Get a random book')
  })
  .post((req, res) => {
    res.send('Add a book')
  })
  .put((req, res) => {
    res.send('Update the book')
  

Следующий уровень — использование встроенного промежуточного ПО Express: express.Router.

Это потребует создания файла маршрутизатора — в этот файл вы можете поместить файлы javascript любого маршрута, который вы создаете. Создадим маршрут для нашего Лабиринта (labyrinth.js):

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

// middleware that is specific to this router
router.use((req, res, next) => {
  console.log('Time: ', Date.now())
  next()
})
// define the home page route
router.get('/', (req, res) => {
  res.send('Labyrinth Home Page')
})
// define about friends route (Ludo, Sir Didymus, Hoggle)
router.get('/friends', (req, res) => {
  res.send('Friends from the Labyrinth')
})

// define about fiends route (Fiery Gang, Hands, Hoggle)
router.get('/fiends', (req, res) => {
  res.send('Fiends from the Labyrinth')
})
module.exports = router

В приложении загрузите этот модуль маршрутизатора:

const labyrinth = require('./labyrinth')

// ...

app.use('/labyrinth', labyrinth)

Мы сможем пройти в /лабиринт, а также в /лабиринт/друзья и /лабиринт/изверги!

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

Источники:

https://www.codecademy.com/article/what-is-express-js

https://expressjs.com/ru/guide/routing.html

https://www.youtube.com/watch?v=iM_S4RczozU