【问题标题】:res.local to pass array through Expressres.local 通过 Express 传递数组
【发布时间】:2020-08-24 13:53:35
【问题描述】:

我正在使用 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()
            }
        })
    }

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

这基本上是可行的,但你可能已经注意到我的问题......

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

感谢您提供的任何帮助。

【问题讨论】:

    标签: javascript node.js mongodb express middleware


    【解决方案1】:
    1. 在中间件之间传递数据时,普遍的共识似乎是res.locals 是这样做的首选方式,另请参阅SO answer
    2. 至于你的第二个问题,你得到checkBoosters.checkBoosters 类型对象模式的主要原因是因为你使用req.checkBoosters = { checkBoosters } 进行分配,而req.checkBoosters = checkBoosters 会给你想要的结果(不使用冗余属性checkBoosters 构造一个新对象) )。

    【讨论】:

    • 谢谢@etarhan - 这完美地回答了我的问题。我仍然对 res.locals 和 req 之间的权衡感到好奇。我有一位高级开发人员教我 req 方法,所以我默认使用该方法,但我同意我看到的所有 SO 答案都使用 res.locals 方法。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2011-11-13
    • 2023-03-27
    • 2011-08-09
    • 2013-12-18
    • 2014-02-19
    相关资源
    最近更新 更多