Три полезных промежуточного программного обеспечения Express | Кодементор

Когда я создавал приложения с помощью Express и Node, я узнал о трех полезных промежуточных программах:

  1. Морган
  2. Верблюжий чехол
  3. Удалить пустые свойства

Из этих трех Morgan является промежуточным программным обеспечением. Вы можете скачать Морган напрямую из npm. Два других — промежуточные программы, которые я создал с помощью верблюжьи ключи а также опустить-пустой соответственно.

Я хочу рассказать, что делают эти три промежуточных ПО и как они облегчают мне жизнь при создании приложений.

Морган

Морган — регистратор запросов. Он сообщает вам несколько вещей, когда ваш сервер получает запрос. Он может регистрировать такие вещи, как:

  • Свидание
  • HTTP-версия
  • Метод
  • Реферер
  • Удаленный адрес
  • Удаленный пользователь
  • Заголовок запроса
  • Заголовки ответа
  • Время отклика
  • Код состояния
  • URL-адрес запроса
  • Агент пользователя

Morgan поставляется с пятью предопределенными форматами на выбор:

  1. Комбинированный
  2. Общий
  3. короткий
  4. Дев
  5. Крошечный

я использую только dev формат. А dev лог от Моргана выглядит так:

Пример журнала разработки.

Я использую Morgan для проверки двух вещей:

  1. Метод и конечная точка
  2. Коды состояния

Проверка метода и конечной точки

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

Например, если вы хотите запустить requestHandler в приведенном ниже коде вам нужно отправить GET просьба к /testing конечная точка.

app.get('/testing', requestHandler)

Если что-то пойдет не так, когда я кодирую серверные приложения, я первым делом проверяю, правильно ли я отправляю метод и конечную точку. Проверка этого в первую очередь помогает мне сэкономить массу времени на отладке того, что было бы опечаткой.

Когда я отправляю запрос на сервер, я получаю лог от Моргана. Этот журнал сообщает мне метод и конечную точку. Первое значение — это метод. Второе значение — это конечная точка.

Идентифицирует метод и конечную точку в журнале разработки.

Проверка кодов состояния

Поскольку серверная часть предназначена для связи, я хочу убедиться, что отправляю правильный код состояния обратно во внешний интерфейс. Если пользователь пытается войти в систему с неправильным именем пользователя или паролем, я хочу отправить 401 несанкционированную ошибку вместо внутренней ошибки сервера 500.

Лучшая часть о dev Формат показывает код состояния разными цветами. Это облегчает обнаружение кодов состояния.

Код состояния 200+ зеленый:

Код состояния 200 зеленый.

Код состояния 300+ — голубой:

Код состояния 300 — голубой.

Код состояния 400+ желтый:

Код состояния 400 желтый.

И код состояния 500+ красный:

Код состояния 500 красный.

CamelCase

Допустим, вы хотите получить имя пользователя из формы. Для этого вам понадобится <form> в вашем HTML. <form> должен содержать <input> с name из first-name.

<form>
  <input name="first-name">
</form>

Получать first-name в бэкенде вам нужно использовать обозначение скобок. Это потому что - является оператором в JavaScript. Он не распознается как дефис.

app.get('/endpoint', (req, res) => {
  // Bracket notation to get the value of a property
  const firstName = req.body['first-name']
})

Мне не нравится использовать запись в скобках. Я предпочитаю использовать запись через точку, когда это возможно.

app.get('/endpoint', (req, res) => {
  // Dot notation
  const firstName = req.body.firstName
})

Я предпочитаю запись через точку, потому что использую ее везде. Я привык писать верблюжий случай на JavaScript. Странно, если я не использую запись через точку. Кроме того, я могу разрушить свойство, если смогу использовать точечную нотацию.

app.get('/endpoint', (req, res) => {
  const { firstName } = req.body
})

Чтобы использовать запись через точку, мне нужно убедиться, что name имущество в <input> элемент написан верблюжьим регистром.

<input name="firstName">

Но это кажется странным, потому что мы обычно не используем верблюжий регистр в HTML! Разделяем слова дефисами!

<!-- This feels weird -->
<input name="firstName">

<!-- This feels normal -->
<input name="first-name">

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

const camelcaseKeys = require('camelcase-keys')

const camelcase = () => {
  return function (req, res, next) {
    req.body = camelcaseKeys(req.body, { deep: true })
    req.params = camelcaseKeys(req.params)
    req.query = camelcaseKeys(req.query)
    next()
  }
}

Вы можете использовать промежуточное ПО следующим образом:

app.use(camelcase())

С camelcaseвам не нужно беспокоиться о first name, first_name, first-nameили же FirstName. Это всегда будет firstName.

Неважно, получаете ли вы от req.body, req.params или же req.query слишком. Все свойства будут в верблюжьем корпусе.

Давайте представим ситуацию, когда вы ожидаете множество навыков.

fetch('/endpoint', {
  method: 'post',
  headers: { 'Content-Type': 'application/json' }
  body: JSON.stringify({
    name: 'Zell',
    skills: ['coding', 'designing', 'writing']
  })
}

Если есть один или несколько навыков, вы хотите добавить навыки в базу данных.

app.post('/endpoint', (req, res) => {
  const { skills } = req.body

  if (skills.length !== 0) {
    // Add skills to database
  }
})

Но у нас есть проблема. Пользователи могут отправить вам вариант запроса:

  1. Не содержит skills имущество
  2. Содержит пустой skills имущество
  3. Содержит skills свойство хотя бы с одним навыком

Если пользователь не отправил вам skills свойство, вы не можете написать skills.length. Вы получите сообщение об ошибке Cannot read property 'length' of undefined.

Для корректной проверки одного или нескольких навыков необходимы два условия:

  1. Проверьте, есть ли массив навыков
  2. Проверьте, есть ли в массиве хотя бы один элемент
app.post('/endpoint', (req, res) => {
  const { skills } = req.body
  
  if (skills && skills.length !== 0) {
    // Add skills to database
  }
})

Есть способ упростить эти проверки. Мое решение состоит в том, чтобы создать промежуточное программное обеспечение с Джона Шлинкерта опустить-пусто упаковка.

omitEmpty удаляет пустые свойства из объекта.

const object = {
  null: null, 
  undefined: undefined,
  emptyString: '',
  emptyArray: [],
  emptyObject: {},
  filled: 'yay'
}

console.log(omitEmpty(object))
// {
// filled: 'yay'
// }

Вот промежуточное ПО, которое я сделал:

const omitEmpty = require('omitEmpty')

const removeEmptyProperties = () => {
  return function (req, res, next) {
    req.body = omitEmpty(req.body)
    req.params = omitEmpty(req.params)
    req.query = omitEmpty(req.query)
    next()
  }
}

Вы можете использовать removeEmptyProperties Сюда:

app.use(removeEmptyProperties())

Как только вы используете removeEmptyProperties промежуточного программного обеспечения, вам не нужно проверять длину skills. Можете быть уверены skills содержит один или несколько элементов, если он присутствует.

Итак, код становится:

app.post('/endpoint', (req, res) => {
  const { skills } = req.body
  
  if (skills) {
    // Add skills to database
  }
})

Гораздо проще!

Спасибо за чтение. Эта статья изначально была размещена на мой блог. Подписаться на моя рассылка если вы хотите больше статей, которые помогут вам стать лучшим разработчиком внешнего интерфейса.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *