Три полезных промежуточного программного обеспечения Express | Кодементор
Когда я создавал приложения с помощью Express и Node, я узнал о трех полезных промежуточных программах:
- Морган
- Верблюжий чехол
- Удалить пустые свойства
Из этих трех Morgan является промежуточным программным обеспечением. Вы можете скачать Морган напрямую из npm. Два других — промежуточные программы, которые я создал с помощью верблюжьи ключи а также опустить-пустой соответственно.
Я хочу рассказать, что делают эти три промежуточных ПО и как они облегчают мне жизнь при создании приложений.
Морган
Морган — регистратор запросов. Он сообщает вам несколько вещей, когда ваш сервер получает запрос. Он может регистрировать такие вещи, как:
- Свидание
- HTTP-версия
- Метод
- Реферер
- Удаленный адрес
- Удаленный пользователь
- Заголовок запроса
- Заголовки ответа
- Время отклика
- Код состояния
- URL-адрес запроса
- Агент пользователя
Morgan поставляется с пятью предопределенными форматами на выбор:
- Комбинированный
- Общий
- короткий
- Дев
- Крошечный
я использую только dev
формат. А dev
лог от Моргана выглядит так:
Я использую Morgan для проверки двух вещей:
- Метод и конечная точка
- Коды состояния
Проверка метода и конечной точки
Когда вы пишете внутренний код, вам нужно убедиться, что вы отправляете запрос с правильным методом и конечной точкой. Если метод или конечная точка неверны, вы не сможете активировать обработчик запросов, который вы ожидаете активировать.
Например, если вы хотите запустить requestHandler
в приведенном ниже коде вам нужно отправить GET
просьба к /testing
конечная точка.
app.get('/testing', requestHandler)
Если что-то пойдет не так, когда я кодирую серверные приложения, я первым делом проверяю, правильно ли я отправляю метод и конечную точку. Проверка этого в первую очередь помогает мне сэкономить массу времени на отладке того, что было бы опечаткой.
Когда я отправляю запрос на сервер, я получаю лог от Моргана. Этот журнал сообщает мне метод и конечную точку. Первое значение — это метод. Второе значение — это конечная точка.
Проверка кодов состояния
Поскольку серверная часть предназначена для связи, я хочу убедиться, что отправляю правильный код состояния обратно во внешний интерфейс. Если пользователь пытается войти в систему с неправильным именем пользователя или паролем, я хочу отправить 401 несанкционированную ошибку вместо внутренней ошибки сервера 500.
Лучшая часть о dev
Формат показывает код состояния разными цветами. Это облегчает обнаружение кодов состояния.
Код состояния 200+ зеленый:
Код состояния 300+ — голубой:
Код состояния 400+ желтый:
И код состояния 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
}
})
Но у нас есть проблема. Пользователи могут отправить вам вариант запроса:
- Не содержит
skills
имущество - Содержит пустой
skills
имущество - Содержит
skills
свойство хотя бы с одним навыком
Если пользователь не отправил вам skills
свойство, вы не можете написать skills.length
. Вы получите сообщение об ошибке Cannot read property 'length' of undefined
.
Для корректной проверки одного или нескольких навыков необходимы два условия:
- Проверьте, есть ли массив навыков
- Проверьте, есть ли в массиве хотя бы один элемент
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
}
})
Гораздо проще!
Спасибо за чтение. Эта статья изначально была размещена на мой блог. Подписаться на моя рассылка если вы хотите больше статей, которые помогут вам стать лучшим разработчиком внешнего интерфейса.