繁体   English   中英

然后多个mongo查询返回响应

[英]Multiple mongo queries then return response

我正在尝试获取我的数据库中的集合列表,然后返回这些集合中的每个文档以进行备份。 截至目前,有效负载仍然返回空白。 在发送之前,您如何等待填充有效负载? 我的db.close()去哪儿了?

注意:我知道我正确地获取数据,因为如果我使用console.log(数据)而不是推送它,它可以正常工作。

app.post('/admin/saveMongoDB',async(req,res)=>{
  let payload=[]
  MongoClient.connect(url,{ useNewUrlParser: true}, function (err, db){
    if (err) throw err;
    var dbo = db.db("probes");
    dbo.listCollections().toArray().then(ctx=>{
      ctx.forEach(probe=>{
       dbo.collection(probe.name).find().toArray().then(data=>{
         payload.push(data)
        }).catch(err=>{console.log(err)})
      })
      res.send(payload)
    })
  })
})```

您的payload确实是一个空数组,因为在res.send(payload)之后执行ctx.forEach

由于您使用的是Promise您可以重新编写代码以使用Promise.all

dbo.listCollections().toArray().then(ctx => {
  const colls = ctx.map(probe => dbo.collection(probe.name).find().toArray())
  const Promise.all(colls)
    .then(results => {
      // results is an array
      res.send(results)
      db.close();
    })
    .catch(err=>{console.log(err)})
})

有一点需要注意的是Promise.all快速失败功能。 如果任何promise失败(你的一个db查询失败), then根本不会被调用。 但是既然你正在接受备份,我认为这是可以接受的。

app.post('/admin/saveMongoDB', async (req, res) => {
  let payload = []
  let i = 0
  MongoClient.connect(url, {
    useNewUrlParser: true
  }, function (err, db) {
    if (err) throw err;
    var dbo = db.db("Accuprobes");
    dbo.listCollections().toArray().then(ctx => {
      ctx.forEach(probe => {
        dbo.collection(probe.name).find().toArray().then(data => {
          i++
          payload.push({
            [probe.name]: data
          })
          if (i == ctx.length) {
            res.send(payload)
            fs.writeFile('./backups/accuprobeHistoricalData' + (new Date).getTime() + '.txt', JSON.stringify(payload), function (err) {
              if (err) {
                return console.log(err)
              }
              console.log('MongoDB Succesfully Saved')
            })
          }
        }).catch(err => {
          console.log(err)
        })
      })
    })
  })
})

我最后通过创建迭代器来解决我的问题,当匹配探测量时,我发送了我的响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM