【问题标题】:Express value assignment after middleware: Value assigned to this primitive will be lost中间件后的快速赋值:赋值给这个原语的值将会丢失
【发布时间】:2019-10-26 19:41:54
【问题描述】:

我在 express 中有两个路由处理程序,一个是参数回调中间件,在匹配 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);
        }
    };

有什么问题吗,比如边缘情况,还是只是误报,因为我看到此警告的其他情况不正确。

【问题讨论】:

  • stackoverflow.com/questions/37923424/… 看看这个可能有帮助!
  • @VenkatShukla 是的,我之前确实看到过,但是考虑到错误的显示方式,因为他们将其视为错误,所以我期望在我的情况下是相反的,因为使用回调我想我有一些“包装”?在使用 async/await 时,“包装器”已被删除,因此它应该是带有警告的回调,而另一个带有 async/await 则没有它。

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


【解决方案1】:

当您在 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);
        }
    };

【讨论】:

  • 您对用法的看法是正确的,实际上并没有读到这件事是官方的方式。虽然警告仍然显示,但我也没想到会出现这种情况,考虑到回调方法没有显示它。
猜你喜欢
  • 1970-01-01
  • 2016-11-06
  • 2011-09-03
  • 2016-10-21
  • 2013-12-03
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多