Используйте Express валидатор версии 6.4.0 вместе с express upload.Check проверки ввода перед выполнением сообщения на маршруте - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу проверить входные данные, включая загрузку изображения с помощью express -validator при использовании express -upload для анализа многочастных данных. Я хочу пройти проверку, если загружаемый файл является изображением, а также если изображение не загружено . Я работаю вместе с учебником YouTube , который использует устаревший API ( ссылка на устаревший API ) таким образом, чтобы достичь того, чего я хочу. Я застрял на реализации того же в новая версия и хотел бы использовать новый express -validator в проекте

Legacy api app. js

// Some code omitted for simplicity
// Express Validator middleware

var expressValidator = require('express-validator');
app.use(expressValidator({
        errorFormatter: function (param, msg, value) {
            var namespace = param.split('.')
                    , root = namespace.shift()
                    , formParam = root;

        while (namespace.length) {
            formParam += '[' + namespace.shift() + ']';
        }
        return {
            param: formParam,
            msg: msg,
            value: value
        };
    },
    customValidators: {
        isImage: function (value, filename) {
            var extension = (path.extname(filename)).toLowerCase();
            switch (extension) {
                case '.jpg':
                    return '.jpg';
                case '.jpeg':
                    return '.jpeg';
                case '.png':
                    return '.png';
                case '':
                    return '.jpg';
                default:
                    return false;
            }
        }
    }
}));

Файл маршрута, в котором также обрабатывается проверка для прежнего API admin_product. js

/*
 * POST add product
 */
router.post('/add-product', function (req, res) {

    var imageFile = typeof req.files.image !== "undefined" ? req.files.image.name : "";

    req.checkBody('title', 'Title must have a value.').notEmpty();
    req.checkBody('desc', 'Description must have a value.').notEmpty();
    req.checkBody('price', 'Price must have a value.').isDecimal();
    req.checkBody('image', 'You must upload an image').isImage(imageFile);

    var title = req.body.title;
    var slug = title.replace(/\s+/g, '-').toLowerCase();
    var desc = req.body.desc;
    var price = req.body.price;
    var category = req.body.category;

    var errors = req.validationErrors();

    if (errors) {
        Category.find(function (err, categories) {
            res.render('admin/add_product', {
                errors: errors,
                title: title,
                desc: desc,
                categories: categories,
                price: price
            });
        });
    } else {
        Product.findOne({slug: slug}, function (err, product) {
            if (product) {
                req.flash('danger', 'Product title exists, choose another.');
                Category.find(function (err, categories) {
                    res.render('admin/add_product', {
                        title: title,
                        desc: desc,
                        categories: categories,
                        price: price
                    });
                });
            } else {

                var price2 = parseFloat(price).toFixed(2);

                var product = new Product({
                    title: title,
                    slug: slug,
                    desc: desc,
                    price: price2,
                    category: category,
                    image: imageFile
                });

                product.save(function (err) {
                    if (err)
                        return console.log(err);

                    mkdirp('public/product_images/' + product._id, function (err) {
                        return console.log(err);
                    });

                    mkdirp('public/product_images/' + product._id + '/gallery', function (err) {
                        return console.log(err);
                    });

                    mkdirp('public/product_images/' + product._id + '/gallery/thumbs', function (err) {
                        return console.log(err);
                    });

                    if (imageFile != "") {
                        var productImage = req.files.image;
                        var path = 'public/product_images/' + product._id + '/' + imageFile;

                        productImage.mv(path, function (err) {
                            return console.log(err);
                        });
                    }

                    req.flash('success', 'Product added!');
                    res.redirect('/admin/products');
                });
            }
        });
    }

});

Я застрял и хотел бы использовать новый express -валидатор в проекте

1 Ответ

0 голосов
/ 16 марта 2020

У меня была такая же проблема, но я решил ее следующим образом: 1) создайте такую ​​функцию:

function isImage (files) {

if (files !== null) {

    let extension = files.image.name.split('.').pop();
    console.log(extension)
    switch (extension) {
        case 'jpg':
            return true;
        case 'jpeg':
            return true;

        case 'png':
            return true;

        default:
            return false;
    }
} else return false;

}

2) затем вызовите функцию сразу после validationResult (req), как показано ниже, и pu sh ваш пользовательский объект ошибки следующим образом:

errors = validationResult (req);

    if (!isImage(req.files))

        errors.errors.push({ value: '', msg: 'You must upload an image', param: 'image', location: 'body' })
...