[英]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.