Экспресс-присваивание значений после промежуточного программного обеспечения: значение, присвоенное этому примитиву, будет потеряно - PullRequest
0 голосов
/ 12 июня 2019

У меня в экспрессе есть два обработчика маршрута, один из которых является промежуточным программным обеспечением обратного вызова param, который выполняется, когда параметр соответствует, а второй тоже выполняется с указанным выше параметром в методе DELETE.

Код выглядит следующим образом:

const findPlan = async function (req, res, next) {
        try {
            let projection = {};
            let plan = await AppPlans
                .findOne({_id: req.params.appPlanID, active: true})
                .select(projection)
                .exec();
            if (!plan) {
                let err = new Error("No plan found");
                err.status = 404;
                return next(err);
            }
            req.plan = plan;
            return next();
        } catch (err) {
            return next(err);
        }
    };

const deletePlan = async function (req, res, next) {
        try {
            req.plan.active = false;
            await req.plan.save();
            return res.sendStatus(202);
        } catch (err) {
            return next(err);
        }
    };

Сказанное выше дает мне со стороны req.plan.active = false предупреждение:

Значение, присвоенное этому примитиву, будет потеряно

Ранее предупреждение не отображалось, в то время как запрос Mongoose для функции findPlan был определен с обратным вызовом, как:

const findPlan = function (req, res, next) {
        try {
            let projection = {};
            AppPlans
                .findOne({_id: req.params.appPlanID, active: true})
                .select(projection)
                .exec(function (err, plan) {
                    if (err) {
                        return next(err);
                    }
                    else if(!plan){
                        let err = new Error("No plan found");
                        err.status = 404;
                        return next(err);
                    }
                    req.plan = plan;
                    return next();
                });
        } catch (err) {
            return next(err);
        }
    };

Что-то не так, например, случай с краем илиэто просто ложное срабатывание, так как я вижу, что другие случаи этого предупреждения были неверными.

1 Ответ

0 голосов
/ 12 июня 2019

Когда вы передаете значения между промежуточным ПО в Express.js, вы должны использовать res.locals для хранения значений, так как это официально документированный подход.Это может быть причиной предупреждения.

const findPlan = async function (req, res, next) {
        try {
            let projection = {};
            let plan = await AppPlans
                .findOne({_id: req.params.appPlanID, active: true})
                .select(projection)
                .exec();
            if (!plan) {
                let err = new Error("No plan found");
                err.status = 404;
                return next(err);
            }
            res.locals.plan = plan;
            return next();
        } catch (err) {
            return next(err);
        }
    };

const deletePlan = async function (req, res, next) {
        try {
            res.locals.plan.active = false;
            await res.locals.plan.save();
            return res.sendStatus(202);
        } catch (err) {
            return next(err);
        }
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...