2
I’m trying to add input data validation to a small script I built using Express, the validation part is using Yup.
I’m having a hard time organizing things because of the need to work with a custom locale on Yup.
In this file I have the definition of custom messages, as well as a function that generates an array containing rule violation data:
const yup = require('yup')
yup.setLocale({
mixed: {
default: 'é inválido',
required: 'é um campo obrigatório',
oneOf: 'deve ser um dos seguintes valores: ${values}',
notOneOf: 'não pode ser um dos seguintes valores: ${values}',
},
string: {
length: 'deve ter exatamente ${length} caracteres',
min: 'deve ter pelo menos ${min} caracteres',
max: 'deve ter no máximo ${max} caracteres',
email: 'tem o formato de e-mail inválido',
url: 'deve ter um formato de URL válida',
trim: 'não deve conter espaços no início ou no fim.',
lowercase: 'deve estar em maiúsculo',
uppercase: 'deve estar em minúsculo',
},
number: {
min: 'deve ser no mínimo ${min}',
max: 'deve ser no máximo ${max}',
lessThan: 'deve ser menor que ${less}',
moreThan: 'deve ser maior que ${more}',
notEqual: 'não pode ser igual à ${notEqual}',
positive: 'deve ser um número posítivo',
negative: 'deve ser um número negativo',
integer: 'deve ser um número inteiro',
},
date: {
min: 'deve ser maior que a data ${min}',
max: 'deve ser menor que a data ${max}',
},
array: {
min: 'deve ter no mínimo ${min} itens',
max: 'deve ter no máximo ${max} itens',
},
});
const validate = (schema, data) => {
return schema.validate(data, { abortEarly: false })
.then(_ => {
return null
}).catch(err => {
return err.inner.map(item => {
return {
path: item.path,
message: item.message,
label: item.params.label
}
})
})
}
module.exports = { yup, validate }
This is where the above file call is made:
const express = require('express')
const {yup, validate} = require('./validator')
const server = express()
server.use(express.json())
server.use(express.urlencoded({ extended: false}))
server.get('/', async (req, res) => {
schema = yup.object().shape({
name: yup.string().email().required(),
password: yup.string().required()
});
const errors = await validate(schema, req.body)
if (errors) {
return res.json(errors)
}
return res.json({ sucess: true})
})
server.listen(3000)
In my view I’m doing it wrong, but I can’t determine if I have to separate responsibilities, use constants to store the custom mailing list and the validate function or even a Singleton.
whereas not all application routes will input data, as I could address this issue of separation of responsibilities?
Man, I really think Yup can’t stand this kind of stuff... You can format the error by sending keys to the client (as if they were codes) and it is responsible for translating each key to the given language. You can also search for another validation library...
– Luiz Felipe