Как проанализировать тело запроса метода POST в машинописном тексте?

У нас есть внутренний 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"
    }
}

Не могли бы вы помочь мне понять, как я могу убедиться, что если есть какое-либо несоответствие типов, оно фиксируется при анализе самого тела запроса.

Я использую:

  1. Машинопись - 5.3.3
  2. NodeJS — 20.10.0
  3. Экспресс - 4.18.2
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
94
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Насколько я понимаю, код 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
}

Это полезно для нескольких полей, но что, если тело запроса содержит слишком много (20–30) полей? В теле запроса есть возможность отправить дополнительные фильтры, такие как услуги, дата начала и т. д. Проверка типа вручную будет кошмаром. Итак, я рассматривал пакет или библиотеку OOTB, чтобы выполнять проверку типов свойств объекта, прежде чем он сопоставит один объект (тело запроса) с другим объектом (наш определенный тип) и выдаст ошибку при несоответствии типов.

Ranjeet 21.06.2024 06:28

Улучшение ответа 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/

Да, последние несколько дней я сравнивал Зода и Джоя. Наконец, решил пойти с Джоем.

Ranjeet 16.07.2024 12:28

Другие вопросы по теме

Как создать гиперссылку в файле Typescript? Угловой 16+
React Query – использовать ответ от выборки списка на setQueryData для каждого элемента?
Как установить новое значение для «Сигнала», который вызывается из «Эффекта»?
Как я могу вывести типы аргументов нескольких функций в TypeScript
Сопоставьте значения из NgForm с моделью машинописного текста, определенной в Angular
Могу ли я использовать файлы ts точно так же, как я использую файлы js?
Проблема вывода типа с массивом универсальных объектов конфигурации с разными внутренними типами, которые зависят от другого внутреннего свойства
Почему добавление круглых скобок удаляет «только для чтения [x: число]: число;» из этого типа?
Введите 'строка | логическое значение не может быть назначено для ввода «никогда» в машинописном тексте
Как добавить динамические метаданные на страницу [slug] в маршрутизаторе приложений next.js