Para validação dos dados no front-end a biblioteca yup é muito boa

jquense/yup

No back-end vamos utilizar a biblioteca celebrate que integra muito bem com o express

arb/celebrate

Vamos nistalar o celebrate no nosso projeto do back-end

npm install celebrate
npm install @types/hapi__joi -D

Vamos trabalhar em routes.ts com a rota de cadastro que é única rota de cadastro e que precisa de validação.

Vamos importar o celebrate e o Joi, que é a biblioteca que o celebrate se base. Em sequência vamos utilizar o celebrate na nossa rota post. Ele consegue fazer vários tipos de validações, mas nós vamos utilizar agora validação para o body que é onde estão todos os campos

routes.post(
  '/points',
   upload.single('image'),
   celebrate({
       body: Joi.object().keys({
           name: Joi.string().required(),
           email: Joi.string().required().email(),
           whatsapp: Joi.number().required(),
           latitude: Joi.number().required(),
           longitude: Joi.number().required(),
           city: Joi.string().required(),
           uf: Joi.string().required().max(2),
           items: Joi.string().required(),
       })
   }),
   pointsController.create 
)

A validação de imagem podemos fazer pelo multer no filterImage se quisermos

No server.ts vamos importar errors de celebrate, que nos trará uma forma de como vamos lidar com os erros e mostrar no front-end

Agora vamos testar fazendo uma requisição no Insomnia

→ Primeiro com os dados certos, do mesmo jeito que fizemos a última (tem que funcionar)

→ Agora vamos testar tirando o nome

Perceba que deu erro, mas se mais de um campo não for preenchido vai retornar apenas o primiro erro.

Então na nossa configuração de validações vamo passar um segundo objeto para o celebrate e a propriedade abortEarly como false, assim ele vai retornar todos os erros