无法操纵 mongoose 查询结果 - 承诺未定义

Posted

技术标签:

【中文标题】无法操纵 mongoose 查询结果 - 承诺未定义【英文标题】:Can't manipulate mongoose query result - promise undefined 【发布时间】:2020-12-23 05:20:06 【问题描述】:

我是猫鼬和承诺的新手,所以我可能不太清楚,事情是这样的:

我正在编写我的应用程序 (MEAN),其中我的控制器中堆叠了一些 Web 服务来检索和获取内容。我举个例子吧。

exports.allowanceCheck = (req, res) => 

  let payload = req.body.excelparam
  let day = getDate(payload[0].data_accesso,1)
  var dummyVar

   return AccessList.aggregate([
    '$match' : 'id': day,
    '$unwind' : '$employees',
    
      $group: 
        _id: '$id',
        count:  $sum: 1 
      
    
   ])
  .exec()
  .then((list) => 
    console.log(list) //not working
    res.json(list)
    dummyVar = list
  )
  .catch((err) => 
    res.status(500).send(err)
    
  )


console.log(list) //not working
console.log(dummyVar) //not working

Web 服务运行良好,客户端得到他的​​响应 JSON:

[
    
        "_id": "200830",
        "count": 2
    
]

我现在遇到的问题是,如果我想对这个“列表”JSON 数据做一些事情,我会得到一个错误,我试图操纵 undefined 东西。 (例如,你看到的任何地方//不工作 - 可能在其他任何地方) 所以我只能将数据发回,我无法操作任何东西。

我尝试保存承诺并访问它,但没有成功。

我做错了什么?

谢谢! :)

【问题讨论】:

【参考方案1】:

您可以尝试以下方法以更好地理解promise

    exports.allowanceCheck = (req, res) => 

    let payload = req.body.excelparam
    let day = getDate(payload[0].data_accesso, 1)

    functionAllowanceCheck(day).then((listResponse) => 
        console.log(listResponse) //working
        res.json(listResponse)
    ).catch((listError) => 
        res.status(500).send(listError)
    )



const functionAllowanceCheck = (day) => 
    return new Promise((resolve, reject) => 
        AccessList.aggregate([
             '$match':  'id': day  ,
             '$unwind': '$employees' ,
            
                $group: 
                    _id: '$id',
                    count:  $sum: 1 
                
            
        ]).exec((err, list) => 
            if (err) 
                reject(err)
             else 
                resolve(list)
            
        )
    )
  

【讨论】:

介绍Explicit Promise Anti-pattern 更多的是阻碍而不是帮助。 谢谢!现在我想在 then 子句之外使用“count”值,因为我想保留结果,进行另一个查询,然后响应将所有数据附加到 WS 调用触发的相同响应中。策略应该是什么?仍然无法读取 dummyVar 值 :( 你可以试试 let result = JSON.parse(JSON.stringify(listResponse)) 之后你就可以更新值了 @vishalpankhaniya 很遗憾不能,请在下面回复。有什么线索吗?【参考方案2】:

@vishalpankhaniya 不幸的是 :( 在街区之外阅读它是不可能的。 我尝试在块内部和之前创建一个 var 并且它没有改变(让不应该在整个 permitCheck 中工作,对吧?)

exports.allowanceCheck = (req, res) =>  
   ... 
   var lista = JSON.parse(JSON.stringify(listResponse)) 
   ... 
   ).catch((listError) =>  
      res.status(500).send(listError) 
   ) 
console.log(lista) 

【讨论】:

以上是关于无法操纵 mongoose 查询结果 - 承诺未定义的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 不会在 co 中产生 findeOne 结果

如何承诺 Mongo/Mongoose 找到

无法得到我在 nodejs / mongoose / bluebird 中返回的承诺

无法从 Mongoose 模型中获取文档“find”承诺

蓝鸟承诺:循环猫鼬结果

猫鼬承诺文档说查询不是承诺?