Промежуточное программное обеспечение преобразуется в асинхронное / ожидание - PullRequest
0 голосов
/ 22 февраля 2020

Я начал изучать ES6, и я преобразовываю свой проект из ES5 в ES6. Я хочу спросить, имеет ли смысл использовать async / await в промежуточном программном обеспечении? Как использовать это в этом примере:

middlewareObj.checkCampground = (req,res,next) =>{
if(req.isAuthenticated()){
    Campground.findById(req.params.id, (err, foundCampground) =>{
        if(err || !foundCampground){
            req.flash("error", "Campground not found");
            res.redirect("back");
        } else {
            if(foundCampground.author.id.equals(req.user._id) || req.user.isAdmin){
                next();
            } else {
                req.flash("error", "You don't have permission to do that");
                res.redirect("back");
            }
        }
    });
} else {
    req.flash("error", "You need to be logged in to do that");
    res.redirect("back");
}

};

1 Ответ

0 голосов
/ 22 февраля 2020

Когда у вас есть только одна асинхронная операция, как вы делаете здесь, вы не сильно выиграете (если вообще что-нибудь) от переключения на await. Большие преимущества появляются, когда вам нужно упорядочить несколько асинхронных операций и, возможно, даже иметь некоторые ветвления. Тогда await позволяет вам писать гораздо более простой код.

Кроме того, большая часть вашего кода на самом деле предназначена только для проверки результатов и возврата правильного сообщения об ошибке пользователю, что не намного проще с await, так как это просто куча проверок. в любом случае.

Вот реализация, которая также пытается использовать исключения для консолидации всех возвратов ошибок, поэтому у вас не так много мест, где вы делаете req.flash() и res.redirect():

middlewareObj.checkCampground = async (req,res,next) => {
    try {
        if(req.isAuthenticated()) {
            throw new Error("You need to be logged in to do that");
        }
        const foundCampground = await Campground.findById(req.params.id);
        if (!foundCampground) {
            throw new Error("Campgound not found")
        }
        if (foundCampground.author.id.equals(req.user._id) || req.user.isAdmin) {
            next();
        } else {
            throw new Error("You don't have permission to do that");
        }

    } catch(e) {
        console.log(e);
        req.flash(e.message);
        res.redirect("back");
    }
};

Вот еще одна альтернатива без async/await, которая просто пытается немного консолидировать обработку ошибок. Вы не можете обойти тот факт, что есть три if проверки и четыре возможных ошибки:

middlewareObj.checkCampground = (req,res,next) => {
    function error(msg, location = "back") {
        req.flash(msg);
        res.redirect(location);
    }

    if(req.isAuthenticated()) {
        error("You need to be logged in to do that");
        return;
    } 
    Campground.findById(req.params.id).then(foundCampground => {
        if (!foundCampground) {
            error("Campground not found");
        } else if (foundCampground.author.id.equals(req.user._id) || req.user.isAdmin) {
            next();            
        } else {
            error("You don't have permission to do that");
        }
    }).catch(err => {
        console.log(err);
        error("Database Error - Campground not found");
    });
};

Обратите внимание, что в обоих случаях я проверяю и регистрирую фактическую ошибку базы данных, если она есть .

...