Pesquisa de site

typescript - Propriedade 'path' não existe no tipo 'ValidationError'. com express-validator 7.0.1


Estou tentando acessar o campo path do express-validator 7.0.1. Mas quando faço isso, recebo o erro "Propriedade 'path' não existe no tipo 'ValidationError'".

import express, { Request, Response } from "express";
import { check, validationResult } from "express-validator";

import { save } from "./UserService";

const router = express.Router();
type ValidationResultError = {
  [string: string]: [string];
};

router.post(
  "/api/1.0/users",
  check("username").notEmpty().withMessage("Username cannot be null"),
  check("email").notEmpty().withMessage("E-mail cannot be null"),
  async (req: Request, res: Response) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      const validationErrors: ValidationResultError = {};      
      errors
        .array()
        .forEach((error) => (validationErrors[error.path] = error.msg)); // error is here
      return res.status(400).send({ validationErrors: validationErrors });
    }
    await save(req.body);
    return res.send({ message: "User Created" });
  }
);

Aqui está como é mostrado no editor:

Quando eu modifico o código-fonte onde estou iterando sobre o array errors e registro o objeto error no console:

...
errors.array().forEach((error) => console.log(error));
...

Consigo ver todos os objetos, que têm o campo path no console:

    {
      type: 'field',
      value: null,
      msg: 'Username cannot be null',
      path: 'username',
      location: 'body'
    }

    {
      type: 'field',
      value: null,
      msg: 'E-mail cannot be null',
      path: 'email',
      location: 'body'
    }

Mas eu só consigo acessar o msg e o campo type. Todos os outros campos não funcionam:

Eu não sei como consertar isso.

Resposta #1

Da migração-v6-para-v7#Diferenciando tipos de erro

O tipo ValidationError no TypeScript agora é uma união discriminada.

Pode ser necessário usar um switch ou instruções if para verificar se você está lidando com o tipo que deseja formatar/debugar.

Apenas o FieldValidationError possui o campo path.

type FieldValidationError = {
  type: 'field';
  location: Location;
  path: string;
  value: any;
  msg: any;
};

Além disso, dê uma olhada na documentação do ValidationError

Qualquer um dos erros de validação. É possível determinar qual é o erro realmente olhando para sua propriedade type

import express from 'express';
import { check, validationResult } from 'express-validator';

const router = express.Router();
type ValidationResultError = {
    [string: string]: [string];
};

router.post(
    '/api/1.0/users',
    check('username').notEmpty().withMessage('Username cannot be null'),
    check('email').notEmpty().withMessage('E-mail cannot be null'),
    async (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            const validationErrors: ValidationResultError = {};
            errors.array().forEach((error) => {
                if (error.type === 'field') {
                    // error is FieldValidationError 
                    validationErrors[error.path] = error.msg;
                }
            });
            return res.status(400).send({ validationErrors: validationErrors });
        }
        return res.send({ message: 'User Created' });
    },
);