#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(), и после этого я проверяю регулярное выражение, чтобы оно было числом. Наконец, я преобразую его в число перед его использованием!