У нас есть внутренний API, который ожидает ввода ниже в теле запроса.
type taskslistrequest = {
clientgroupcode: string[];
startindex: number;
pagesize: number;
}
Вот как я анализирую тело запроса:
const tasklistreq: taskslistrequest = req.body.taskslistrequest as taskslistrequest;
Однако машинописный текст не выдает никаких ошибок, если я отправлю ниже тело запроса от почтальона.
{
"taskslistrequest": {
"clientgroupcode": [
"AAB",
"AAC",
"AAD"
],
"startindex": "0",
"pagesize": "50"
}
}
Не могли бы вы помочь мне понять, как я могу убедиться, что если есть какое-либо несоответствие типов, оно фиксируется при анализе самого тела запроса.
Я использую:
Насколько я понимаю, код TypeScript компилируется в код JavaScript, который будет запускаться во время выполнения, поэтому он не может выполнять проверку типа TypeScript во время выполнения на основе сгенерированных запросов. Однако вы можете обойти эту проблему, вручную проверив req.body.taskslistrequest.startindex
и req.body.taskslistrequest.pagesize
, прежде чем продолжить анализ.
if ((typeof req.body.taskslistrequest.pagesize === "number") && (typeof req.body.taskslistrequest.startindex === "number")) {
const tasklistreq: taskslistrequest = req.body.taskslistrequest as taskslistrequest;
} else {
// Type mismatch alert
}
Улучшение ответа Tax_evader - может помочь создание карты для проверки. (Или можно ли было бы получить карту из типа TasklistRequest). В случае других типов просто добавьте еще одну проверку для сопоставления и проверки функции.
map = {
"clientgroupcode" : "array",
"startindex": "number",
"pagesize": "number",
};
function validate(entry) {
const numberRegexp = new RegExp(/^(\d+)$/);
let isValid = true;
for (const [key, type] of Object.entries(map)) {
switch(type) {
case 'number':
if (!numberRegexp.test(entry[key])) {
isValid = false;
console.info("Field " + key + " is not a number");
}
break;
case 'array':
if (!Array.isArray(entry[key])) {
isValid = false;
console.info("Field " + key + " is not an array");
}
break;
default:
isValid = false;
console.info("Field " + key + " not found");
}
}
return isValid;
}
validate(req.body.taskslistrequest);
Мне нравится проверять свой запрос с помощью joi. Вероятно, это будет выглядеть так:
const fooValidation = Joi.object({
var1: joi.array().required().items(
Joi.string())
var2: Joi.number().required()
var3: Joi.string()
})
fooValidation.validate(req.body)
посмотрите документацию https://joi.dev/
Да, последние несколько дней я сравнивал Зода и Джоя. Наконец, решил пойти с Джоем.
Это полезно для нескольких полей, но что, если тело запроса содержит слишком много (20–30) полей? В теле запроса есть возможность отправить дополнительные фильтры, такие как услуги, дата начала и т. д. Проверка типа вручную будет кошмаром. Итак, я рассматривал пакет или библиотеку OOTB, чтобы выполнять проверку типов свойств объекта, прежде чем он сопоставит один объект (тело запроса) с другим объектом (наш определенный тип) и выдаст ошибку при несоответствии типов.