Проверка параметра заголовка с помощью Joi, nodejs?

#javascript #node.js #joi

#javascript #node.js #joi

Вопрос:

Я хочу проверить один параметр (docsLimit в данном случае) заголовка HTTP-запроса. Итак, я сделал это:

 const {
  celebrate,
  Joi,
} = require('celebrate');
const joiObjectId = require('joi-objectid');

Joi.objectId = joiObjectId(Joi);

const limit = celebrate({
  headers: Joi.object().keys({
    docsLimit: Joi.number()
      .required()
      .default(10),
  }).options({ allowUnknown: true })
});

module.exports = limit;
 

в app.js:

 app.get(path, limit, getDocuments);
 

Я должен сказать, что я новичок в nodejs и особенно Joi, но, похоже, это имеет смысл для меня. Вместо этого это неправильно, потому что, если я отправляю строку в заголовках, она все равно принимает ее, даже если я уточнил, что это число. Если я удалю .options({ allowUnknown: true }), то он никогда не пройдет, даже если есть число. В нем говорится: «Необработанное предупреждение promiserejectionwarning: Ошибка [ERR_HTTP_HEADERS_SENT]: не удается установить заголовки после их отправки клиенту» и возвращает json, в котором говорится, что «ограничение не разрешено». Как можно проверить параметр в заголовках с помощью Joi?

Большое вам спасибо!

Комментарии:

1. Заголовки всегда являются строками? Можете ли вы показать нам, что именно вы отправляете?

2. @Bergi спасибо! Проблема заключалась в том, что заголовок всегда является строкой, поэтому я не должен выполнять Joi.number() . Я использую Joi.string() и проверяю регулярное выражение, чтобы оно было числом. После этого я преобразую его в число, прежде чем использовать его! Большое вам спасибо!!

Ответ №1:

Проблема в том, что заголовок всегда является строкой, поэтому я не должен выполнять Joi.number() . Я должен использовать Joi.string(), и после этого я проверяю регулярное выражение, чтобы оно было числом. Наконец, я преобразую его в число перед его использованием!