«Вы не можете смотреть, куда идете, если не знаете, куда идете!» - Хламница, Лабиринт
Навигация по веб-сайту или создание правильного набора конечных точек 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