Необходимо ли проверять одну и ту же схему с помощью joi и mongoose для предотвращения вставки непроверенных данных? - PullRequest
1 голос
/ 20 марта 2019

У меня вопрос: нужна ли двойная проверка с помощью 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.

Что здесь лучше?

1 Ответ

1 голос
/ 20 марта 2019

Вы должны использовать надлежащие функции JOI для проверки ваших данных. Если вы используете, стандарт должен использовать промежуточное программное обеспечение https://www.npmjs.com/package/express-joi-validation, которое выдаст ошибку и не выполнит код в контроллере. И не выполняйте проверку в обработчике конечной точки, используйте промежуточное программное обеспечение, иначе все может запутаться! Самое замечательное, что вам просто нужно передать объект JOI, и пакет позаботится об ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...