У меня вопрос: нужна ли двойная проверка с помощью joi и mongoose для предотвращения вставки непроверенных данных, или если это не нужно, а только заставляет меня терять производительность?Я хочу предотвратить возникновение ошибки при проверке joi, если в этом случае непроверенные данные будут вставлены в MongoDb.Как лучше всего подходит к этому?
Мой код:
Product.js:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const model = mongoose.model;
const ProductSchema = new Schema({
name: {
type: String,
minlength: 5,
maxlength: 50,
required: true,
validate: [{
validator: async name => await Product.where({ name }).countDocuments() === 0,
message: ({ value }) => `El nombre del producto: ${value} ya esta cogido.` // TODO: security
},
{
validator: async function(value) {
const regex = /^[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ\s]{3,48}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}$/;
return await regex.test(value);
},
message: 'solo letras y numeros, sin espacio al principio y al final' // TODO: security
},
]
},
description: {
type: String,
minlength: 30,
maxlength: 250,
required: true,
validate: {
validator: async function(value) {
const regex = /^[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ\s]{28,248}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}$/;
return await regex.test(value)
},
message: 'solo letras y numeros, sin espacio al principio y al final' // TODO: security
}
},
shortDescription: {
type: String,
minlength: 20,
maxlength: 100,
required: true,
validate: {
validator: async function(value) {
const regex = /^[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ\s]{18,98}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}$/;
return await regex.test(value)
},
message: 'solo letras y numeros, sin espacio al principio y al final' // TODO: security
}
},
tags: [{
type: String,
requirer: true,
validate: {
validator: async function(value) {
const regex = /^[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ\s]{3,98}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}$/;
return await ((value && value.length > 4) && (regex.test(value)));
},
message: 'El producto tiene que tener como minimo un tag y cada tag min 5 caracteres solo letras y numeros, sin espacio al principio y al final.' // TODO: security
}
}],
price: {
type: Number,
min: 30,
required: true,
validate: {
validator: async val => await (
val.isInteger && val >= 30
),
message: ({ value }) => `El precio del producto: ${value} es invalido, tiene que ser positivo y mayor o igual a 30` // TODO: security
}
},
create_At: { type: Date, default: Date.now }
});
const Product = model('Product', ProductSchema);
exports.Product = Product;
ProductJoiValidation:
const Joi = require('joi');
const nameSchema = Joi.string().min(5).max(50).regex(/^[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ\s]{3,48}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}$/).label("Nombre del producto").options({
language: {
string: {
regex: {
base: "El nombre del producto no puede contener espacios ni al principio ni al final, solo caracteres alfanumericos"
}
}
}
});
const descriptionSchema = Joi.string().min(30).max(250).regex(/^[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ\s]{28,248}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}$/).label("Descripcion del producto").options({
language: {
string: {
regex: {
base: "La descripcion del producto no puede contener espacios ni al principio ni al final, solo caracteres alfanumericos"
}
}
}
});
const shortDescriptionSchema = Joi.string().min(20).max(100).regex(/^[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ\s]{18,98}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}$/).label("Descripcion corta del producto").options({
language: {
string: {
regex: {
base: "La descripcion del producto no puede contener espacios ni al principio ni al final, solo caracteres alfanumericos"
}
}
}
});
const tagsSchema = Joi.array().items(Joi.string().min(5).regex(/^[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ\s]{3,98}[a-zA-Z0-9ÁÉÍÓÚñáéíóúÑ]{1}$/)).min(1).label("tags").options({
language: {
string: {
regex: {
base: "Los tags del producto no puede contener espacios ni al principio ni al final, solo caracteres alfanumericos"
}
}
}
});
const priceSchema = Joi.number().integer().positive().min(30);
const createProductSchema = Joi.object().keys({
name: nameSchema.required(),
description: descriptionSchema.required(),
shortDescription: shortDescriptionSchema.required(),
tags: tagsSchema.required(),
price: priceSchema.required()
});
function validateCreateProduct(createProduct) {
return Joi.validate(createProduct, createProductSchema, { abortEarly: false });
};
module.exports = {
validateCreateProduct
}
Я хочупредотвратите ошибку при проверке joi, если в этом случае непроверенные данные будут вставлены в MongoDb.
Что здесь лучше?