Обновление записи в базе данных даже при неудачной проверке - PullRequest
0 голосов
/ 09 января 2019

У меня проблема, когда даже при сбое проверки формы запись в базе данных изменяется.

По сути, я пытаюсь отправить форму, получить данные из полей формы и, если проверка не пройдена, она должна отобразить представление с измененным пользовательским вводом, в противном случае отобразить данные из базы данных для этой записи в полях ввода.

После успешной проверки необходимо создать флэш-сообщение для отображения пользователю. Я добавил несколько комментариев в код для пояснения.

 exports.postEditListing = (req, res, next) => {
    // get values from form input on form submission
    const updatedTitle = req.body.title;
    const updatedDescription = req.body.description;
    const updatedCategory = req.body.category;
    const image = req.file;
    const productId = req.body.productId;
    // creates slug from title field
    const updatedSlugTitle = slugify(updatedTitle, {
        lower: true,
        remove: /[*+~.()'"!:@]/g
    });
    const errors = validationResult(req);
    // if there ARE validation errors 
    if (!errors.isEmpty()) {
        // Get categories from database where they aren't equal to what the user selected in the form
        Category.find({ catName: { $ne: updatedCategory } })
        .then(cats =>{
            // render the view again showing the form data either updated by user if they edited fields or from the database
            return res.status(422).render('account/edit-listing', {
                pageTitle: 'Edit Listing',
                path: '/account/edit-listing',
                product: {
                    title: updatedTitle,
                    _id: productId,
                    category: updatedCategory,
                    description: updatedDescription
                },
                errorMessage: errors.array(),
                successMessage: null,
                pendingCount: req.pending,
                approveCount: req.approved,
                rejectCount: req.rejected,
                userId: req.user._id,
                cats: cats
            });
        })
        .catch(err => {
            console.log(err);
        })

    }
    // If validation succeeds, find the product by ID in the database
    Product.findById(productId)
        .then(product => {
            // set database fields to the updated form input values
            product.title = updatedTitle;
            product.description = updatedDescription;
            product.titleSlug = updatedSlugTitle;
            product.category = updatedCategory;
            // if there is a new image selected, delete the existing one and set a new one
            if (image) {
                fileHelper.deleteFile(product.image);
                product.image = image.path;
            }
            // save changes to database.
            return product.save()
                .then(result => {
                    // set flash message and redirect to the same page
                    req.flash('success', 'Category successfully added.');
                    res.redirect('/account/edit-listing/' + product._id);
                    console.log('success!');

                });

        })
        .catch(err => {
            // const error = new Error(err);
            // error.httpStatusCode = 500;
            // return next(error);
            console.log(err);
        });
};

Вторая проблема заключается в том, что если поля заполнены правильно, по-прежнему возникает ошибка:

unhandledPromiseRejectionWarning: необработанное отклонение обещания. это ошибка возникла либо при броске внутри асинхронной функции без блокировки, или отклонив обещание, которое не было обрабатывается с помощью .catch (). (код отклонения: 2)

ОБНОВЛЕНИЕ:

Я изменил приведенный выше код и теперь вижу этот успех! отображается в консоли, даже если есть ошибка проверки, это означает, что этот блок кода выполняется, когда он вообще не должен получить этот код, если проверка завершится неудачей:

        return product.save()
            .then(result => {
                // set flash message and redirect to the same page
                req.flash('success', 'Category successfully added.');
                res.redirect('/account/edit-listing/' + product._id);
                console.log('success!');

            });

1 Ответ

0 голосов
/ 09 января 2019

О первом выпуске. У вас есть оператор if, чтобы проверить, не прошла ли проверка. Таким образом, вы можете добавить оператор else после if и выполнить нужный код только в случае успешной проверки.

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