Как выполнить специальную проверку в приложении Express.js (часть 2)

kak vypolnit speczialnuyu proverku v prilozhenii expressjs chast 2

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

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

Итак, давайте начнем. В разделе 2 данного руководства вы узнаете, как выполнять специальную проверку в программе Express.js.

Чего можно добиться с помощью специальной проверки

  • Его можно использовать для проверки существования сущности в базе данных.
  • Также, чтобы проверить, существует ли определенное значение в массиве, объекте, строке и т.д.
  • Если вы хотите изменить формат данных.

И многое другое…

Библиотека экспресс-валидатора предоставляет a custom метод, который можно использовать для выполнения всех видов пользовательских проверок

Реализация специального валидатора использует цепочный метод custom(). Он принимает функцию валидатора.

Специальные валидаторы возвращают Promises, чтобы показать асинхронную проверку или throw любое значение/отклонить обещание использовать пользовательское сообщение об ошибке.

Теперь я покажу вам примеры вышеприведенных случаев использования специальной проверки.

Проверьте, существует ли сущность в вашей базе данных

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

Например, если кто-нибудь попросит обновить свое имя, вы бы использовали его как основное PUT запрос /api/users/:userId.

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

param('userId')
.exists()
.isMongoId()
.custom(val => UserSchema.isValidUser(val))

isValidUser() это статическая функция, которая совершит асинхронный вызов в базу данных и найдет, существует ли пользователь или нет.

Давайте напишем статическую функцию в mongooseSchema:

UserSchema.statics = {
   isValid(id) {
      return this.findById(id)
             .then(result => {
                if (!result) throw new Error('User not found')
      })
   },
}

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

Проверьте определенные значения в массиве или объекте

Например, если вы хотите применить правило к a имя пользователя что оно должно носить характер @.

Да в вашем POST запрос на создание пользователя или во время обновления вы можете сделать что-то вроде этого:

body('username', 'Invalid Username')
.exists()
.isString().isLowercase()
.custom(val => {   
   
   if (val.indexOf('@') !== -1) return true
    
   return false
}),

Помните: Всегда возвращайте логическое значение обратного вызова .custom() функция. В противном случае ваша проверка может не работать должным образом.

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

Изменить формат входных данных

В библиотеке есть функция Sanitization, с помощью которой выполняется специальная дезинфекция customerSanitizer().

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

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

Мы сохранили обе эти специализации как a type в нашей базе данных.

Простой GET запрос будет выглядеть так:

GET /api/doctors?type=cardiologists,psychiatrist

Теперь в mongodb мы можем использовать $in оператор для поиска нескольких значений свойства.

Базовый запрос в базу данных может выглядеть следующим образом:

Doctors.find({
   type: {
       
     $in: ['cardiologists', 'psychiatrist']
       
   }
})

Это дадут вам все кардиологи и психиатры.

от GET запрос:

req.query = {

  type: "cardiologists,psychiatrist"
  
}

Как вы можете увидеть в req.queryвы получите недвижимость type тип которого – a string.

С помощью.customSanitizer() мы можем превратить строку в массив строк.

На уровне подтверждения:

const commaToArray  = (value="") => value.split(',')

sanitizeQuery('type').customSanitizer(commaToArray),

Теперь мы можем напрямую передать его в запрос в базу данных $in оператор.

Что делать, если я хочу применить некоторые правила для всех элементов массива или ключей в объектах?

через GIPHY

тело:

{
  items:[
    {_id: 'someObjectId', number: '200'},
    ...
  ]
}

Подстановочные знаки

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

The * символ также известен как символ подстановки.

Представьте, что я хочу проверить все _id, numberпредметов.

check('items.*._id')
.exists()
.isMongoId()
.custom(val => ItemSchema.isValid(val)), //similar to isValidUser() 
sanitize('items.*.number').toInt()

Вот и все – вступление к проверке ввода с помощью модуля экспресс-валидатора

Если у вас возникнут какие-то проблемы, не стесняйтесь свяжитесь или прокомментируйте ниже.
Буду рад помочь:)

Не стесняйтесь аплодировать, если вы считаете, что это стоит прочесть!

Следите за Шайлешем Шехаватом, чтобы получать уведомления, когда я публикую новую публикацию.

Первоначально опубликовано на 101node.io 22 сентября 2018 года.

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

Ваш адрес email не будет опубликован.