res.local通过Express

问题描述

我正在使用Express&Node在单个router.get()中通过多个数据库查询来构建数组对象。

为此,我需要:(1)查询一个集合,(2)将结果附加到一个对象,(3)使用next()通过中间件将该对象传递,(4)重复很多次,( 5)以一个带有多个数组的漂亮对象结束。

这是我正在使用的模式(仅一个示例):

},(req,res,next) => {    

    let { checkBoosters } = req;
    let boosterNo = [];
    let boostermogo = [];

    if(!checkBoosters.checkBoosters.length){
        return next()
    }

    //re-check boosters (from sentry)
    for(let i=0; i<checkBoosters.checkBoosters.length; i++){

        Phases.find({name: "Booster",team_oid: checkBoosters.checkBoosters[i]._id,weeks: {$gt: 0}},(err,doc) => {
            
            if(!doc.length){
                boosterNo.push(doc[0])
            }

            if(doc.length){
                boostermogo.push(doc[0])
            }

            if(checkBoosters.checkBoosters.length == i+1){
                res.locals.boostermogo = { boostermogo }
                req.boosterNo = { boosterNo }
                return next()
            }
        })
    }

},next) => {

这基本上可行,但是您可能已经注意到我的问题了……

  1. 我无法决定是否应该使用“ req”或“ res.locals”来存储这些数组?
  2. 对象正在获取“ checkBoosters.checkBoosters”类型的对象模式。我可以避免吗?

感谢您提供的任何帮助。

解决方法

  1. 在中间件之间传递数据时,普遍的共识似乎是res.locals是实现此目的的首选方式,另请参见此SO answer
  2. 关于第二个问题,获得checkBoosters.checkBoosters类型的对象模式的主要原因是因为您使用req.checkBoosters = { checkBoosters }进行分配,而req.checkBoosters = checkBoosters会给您您想要的结果(无需使用冗余属性checkBoosters)。