在中间件之后进行快速值分配:分配给该原语的值将丢失

时间:2019-06-12 10:13:39

标签: node.js express intellij-idea mongoose async-await

我有两个明确的路由处理程序,一个是参数回调中间件,它在匹配parameter时执行,第二个也使用上述参数在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部分给了我警告:

  

分配给该原语的值将丢失

以前,findPlan函数的Mongoose查询是通过回调定义的,但未显示警告,

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 :(得分:0)

在Express.js中的中间件之间传递值时,应使用res.locals来存储值,因为这是official documented的方法。这可能是发出警告的原因。

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);
        }
    };