Для контекста я пытаюсь проверить, действительно ли поле из строки запроса, используемое для интерактивной анонимной доски объявлений, которую я создаю с 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 (*), я всегда получаю правильное значение из запроса,
То, что я ожидаю во втором валидаторе, таково:
- функция стрелки принимает значение из
req.body
, которое извлекается из строки запроса и передается через axios.post
функцию
- функция стрелки вызывает базу данных, чтобы увидеть, сколько потоков или строк в базе данных
- функция стрелки сравнивает значение из строки запроса со значением в базе данных
- функция стрелки возвращает
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.
Полная кодовая база здесь, я думаю, что я рассмотрел соответствующие части, хотя, определенно, не закончил, или стабильный.