Проверка поля с использованием API-интерфейса checkSchema из экспресс-валидатора вместе с экспресс-запросом драйвера mysql - PullRequest
0 голосов
/ 24 мая 2019

Для контекста я пытаюсь проверить, действительно ли поле из строки запроса, используемое для интерактивной анонимной доски объявлений, которую я создаю с NextJS, является действительным на основе количества строк на основе значений идентификатора из базы данных MySQL, чтобы сделать это я использую экспресс-валидаторы, метод проверки checkSchema , пример строки запроса выглядит так:

exclusivethread?threadID=74&boardID=1&title=Memes

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

router.post('/createreply',checkSchema({
  //Validators
  threadsboardsboardsid: {
   // The location of the field, can be one or more of body, cookies, 
headers, params or query.
    in: ['body'],
    // Custom validator:
    custom:{
      //Validates between if the query is with range for valid boards, between 1 and 18.
      options:(threadsboardsboardsid) => {
       if(0 < threadsboardsboardsid && threadsboardsboardsid < 19){
       return true;
    }},
    errorMessage:'That board does not exist in the database!'
}

Первый валидатор для body.threadsboardsboardsid работает нормально, но второй пользовательский валидатор не работает:

  },
  threadsthreadsid:{
    in:['body'],
    custom:{
      options:(threadsthreadsid) => {
        var queryValidationResults;
        //The query is async, so having a call back makes it run in order.
        function setQueryValidationResults(results){
          queryValidationResults = results;
        }

        //Validates to see if the query is within range between the valid threads
        hidden_connection.query('SELECT COUNT(threads_id) AS threads_count FROM threads', function (error, results, fields) {
      if (error) throw error;
      else{
        setQueryValidationResults(results[0].threads_count);
      }
    });

    if(0 < threadsthreadsid && threadsthreadsid <= queryValidationResults){
       return true;
    }
  },
  errorMessage:'That thread does not exist in the database!'
  }
}
  }) 

Когда я запускаю запрос COUNT (*), я всегда получаю правильное значение из запроса,

То, что я ожидаю во втором валидаторе, таково:

  1. функция стрелки принимает значение из req.body, которое извлекается из строки запроса и передается через axios.post функцию
  2. функция стрелки вызывает базу данных, чтобы увидеть, сколько потоков или строк в базе данных
  3. функция стрелки сравнивает значение из строки запроса со значением в базе данных
  4. функция стрелки возвращает true или false на основе сравнения, а checkSchema устанавливает ошибку или не ошибку.

Когда я пытаюсь отправить допустимую строку запроса, как в примере выше (например, число потоков равно 1500, я получаю это в массиве ошибок для метода checkSchema):

errors.array [ { location: 'body',
    param: 'threadsthreadsid',
    value: '74',
    msg: 'That thread does not exist in the database!' } ]

из следующей функции в router.post:

function(req, res, next) {
     console.log('createreply request body:',req.body);
     // Finds the validation errors in this request and wraps them in an object with handy functions
    const errors = validationResult(req);
    console.log('errors.array',errors.array());
     if (!errors.isEmpty()) {
      return res.status(422).send('Invalid value, range bad.');
    }
//... `INSERT` validated queries or ignore them.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...