<MyRusakov.ru />

Профессия Web-разработчик

Профессия Web-разработчик

Этот комплект за 8 месяцев превратит Вас в Web-разработчика с нуля. Учиться достаточно 1 час в день.

Начнёте Вы с HTML, CSS и вёрстки сайтов. Потом перейдёте к программированию и JavaScript. Затем изучите PHP, MySQL, SQL, Python. Изучите Web-фреймворки Laravel и Django. Создадите 5 своих сайтов для портфолио.

Комплект содержит:

- 540 видеоуроков

- 110 часов видео

- 1205 заданий для закрепления материала из уроков

- 5 финальных тестов

- 7 сертификатов

- 12 Бонусных курсов

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Роутинг на стороне сервера в NodeJS

Роутинг на стороне сервера в NodeJS

В данной статье я покажу Вам как можно сделать простой роутинг на стороне сервера в NodeJS.

Итак, далее код сервера:

import http from 'http'
import { findRoute } from './router.js'
import url from 'url'

/**
 * Обработчики запросов (Контроллеры)
 *
 * @type {{error404: handlers.error404, userPost: handlers.userPost, index: handlers.index, posts: handlers.posts, user: handlers.user, users: handlers.users}}
 */
const handlers = {

    // главная страница
    index: (req, res) => {
        res.write('Index page')
    },


    // страница всех записей блога
    posts: (req, res) => {
        res.write('Post page')
    },

    // страница со статьей конкретного пользователя
    userPost: (req, res) => {
        res.write(`User ${req.params.name} wrote post ${req.params.postName}`)
    },

    users: (req, res) => {
        res.write('Users page')
    },

    user: (req, res) => {
        res.write(`User ${req.params.name}`)
    },

    error404: (req, res) => {
        res.write('Error 404')
    }
}


// список маршрутов
const routes = [
    { name: 'index@index', url: '/', handler: handlers.index },
    { name: 'index@userPost', url: '/user/:name/post/:postName', handler: handlers.userPost },
    { name: 'index@posts', url: '/posts', handler: handlers.posts },
    { name: 'index@users', url: '/users', handler: handlers.users },
    { name: 'index@user', url: '/user/:name', handler: handlers.user },
    { name: 'index@notfound', url: '/notfound', handler: handlers.error404 },
]

// маршрут при ошибке 404
const getNotFoundRoute = (routes) => routes.find(route => route.name === 'index@notfound')


// пишет необходимые заголовки
function writeHeaders(req, res, callback) {
    res.setHeader('Content-Type', 'text/html; charset=utf8');
    callback(req, res);
    res.end();
}


// главная функция
function main(req, res)
{
    // получаем запрошенный путь
    const { pathname } = url.parse(req.url)

    // ищем подходящий маршрут
    const route = findRoute(pathname, routes, getNotFoundRoute(routes));

    // отдаем ответ в браузер
    writeHeaders(req, res, route.handler);
}


// создаем сервер по адресу http://localhost:9090
http.createServer(main).listen(9090)

Код роутера

import http from 'http';

// является ли значение числом
const isNumeric = (n) => !isNaN(n)


// преобразовываем значения параметров запроса в числа
const objectPropToNumber = (obj) => {

    Object.keys(obj).forEach(key => {

        if (isNumeric(obj[key])) {
            obj[key] = Number(obj[key])
        }

    })

    return obj;
}


// преобразуем URL маршрута в регулярное выражение
export const convertRouteURLToRegEx = (routeURL) => {

    let _routeURL = routeURL
        .replace(/:(\w+)/g,'(?<$1>\\w+)')
        .replace(/\//g,'\\/')


    return new RegExp(`^${_routeURL}$`)
}


/**
 * Ищем маршрут
 *
 * @param path   {string} строка запроса от пользователя
 * @param routes {Array<Object>} массив всех маршрутов
 * @param fallbackRoute {Object} маршрут 404
 * @returns {*|number|bigint}
 */
export function findRoute(path, routes, fallbackRoute)
{
    http.IncomingMessage.prototype.params = {}

    const foundRoute = routes.find(route => {

        const routeRegex = convertRouteURLToRegEx(route.url)
        const matches = path.match(routeRegex)

        //console.log('Path: ', path, '| RouteURL: ', route.url, '| RouteRegex: ', routeRegex, '| Matches: ', matches)

        if( matches ) {
            console.log('!!!Matched!!!', route)

            // если у маршрута есть параметры, т.е. маршрут имеет такой вид
            // /user/:name/post/:id, то кладем в прототип запроса (IncomingMessage) объект params
            // в контроллерах сможем получать их значения вот так
            // req.params.name или req.params.id
            if( Object.keys(matches.groups).length > 0 )
                http.IncomingMessage.prototype.params = objectPropToNumber(matches.groups);

            return route
        }
    })

    return foundRoute ? foundRoute : fallbackRoute

}

Код достаточно хорошо комментирован, но если остались вопросы - задавайте их в комментариях!

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (5):

VaSla VaSla 23.07.2020 15:06:56

Уважаемый Михаил! Спасибо за ваши статьи. Подскажите пожалуйста как открыть rasp.xml на javascript из папки мои документы(или вложенной в мои документы папке). Нужно для того чтобы клиент сохранял в удобную папку rasp.xml и в браузере просматривал и дополнял информацию в нем. Спасибо заранее!

Ответить

Castels Castels 24.07.2020 13:57:13

Здравствуйте! Расскажите, пожалуйста, подробнее о Вашей задаче - не очень понятно - 1) что за файл (примерное содержание), 2) почему в браузере (нужен интерфейс?), xml можно и в текстовом редакторе редактировать

Ответить

VaSla VaSla 24.07.2020 16:35:00

Это обычный файл расписания нужных действий. не всегда есть интернет поэтому возникла идея сбрасывать пользователям xml файл и на Javascript написать небольшое приложение для просмотра расписания и его дополнения. на php это делали fileRasp.load

Ответить

Castels Castels 24.07.2020 18:39:09

Пожалуйста, еще более подробно, желательно по пунктам, распишите, что Вы хотите. Если я правильно понял (могу ошибаться), Вам нужно браузерное приложение, которое будет позволять пользователю открывать xml файл, редактировать его, а затем сохранять. "не всегда есть интернет" - т.е. когда Интернет появляется скидывать этот файл всем остальным

Ответить

VaSla VaSla 26.07.2020 12:55:01

Спасибо большое за ответ. Да хочу узнать как на JS открыть файл xml, изменить его и записать. И все это в каталоге мои документы или загрузки. Заранее благодарю.

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.