Как проанализировать тело запроса метода 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

🤔 А знаете ли вы, что...
Node.js поддерживает работу с файлами и директориями на сервере.


1
94
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
}

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