Javascript ExpressJs等待MongoDB获取数据并在输出之前循环
我很难理解这一点,我有一个来自MongoDB(集合)的表用于评论,另一个用于用户的集合 页面加载时,它会查找注释集合并选择相关注释,然后搜索用户表以查找发表注释的用户的姓名,数据将被合并,然后发送响应 但是,输出是在从用户表中提取并添加数据之前发送的。我怎样才能解决这个问题,这是我的代码Javascript ExpressJs等待MongoDB获取数据并在输出之前循环,javascript,node.js,mongodb,express,promise,Javascript,Node.js,Mongodb,Express,Promise,我很难理解这一点,我有一个来自MongoDB(集合)的表用于评论,另一个用于用户的集合 页面加载时,它会查找注释集合并选择相关注释,然后搜索用户表以查找发表注释的用户的姓名,数据将被合并,然后发送响应 但是,输出是在从用户表中提取并添加数据之前发送的。我怎样才能解决这个问题,这是我的代码 var output = [] const Comments = require('comments.js') const Users = require('users.js') functi
var output = []
const Comments = require('comments.js')
const Users = require('users.js')
function delay( ) {
return new Promise(resolve => setTimeout(resolve, 300))
}
async function delayedProcess(item) {
await delay()
Users.findById(item.user, async function(err, result) {
Object.assign(item, {name: result.name})
output.push(item)
})
}
async function processArray(array) {
const promises = array.map(delayedProcess)
await Promise.all(promises)
return res.json({data: output})
}
Comments.find({page_id: id}).sort({post_date:-1}).limit(6).then(function(data) {
processArray(data)
})
您没有从
delayedProcess
函数返回promise
好了:-
const Comments = require('comments.js')
const Users = require('users.js')
const output = []
function delayedProcess(item) {
return new Promise((resolve, reject) => {
Users.findById(item.user, function(err, result) {
if (err) return reject (err);
output.push({ ...item, name: result.name })
return resolve()
})
})
}
async function processArray(array) {
const promises = array.map(async(item) => {
await delayedProcess(item)
})
await Promise.all(promises)
return res.json({ data: output })
}
const data = await Comments.find({ page_id: id }).sort({ post_date: -1 }).limit(6)
processArray(data)
但是,您将始终获得连接的数组。因此,将其作为全局变量,将其作为局部变量
function delayedProcess(item) {
return new Promise((resolve, reject) => {
Users.findById(item.user, function(err, result) {
if (err) return reject (err);
return resolve({ ...item, name: result.name })
})
})
}
async function processArray(array) {
const output = []
const promises = array.map(async(item) => {
const it = await delayedProcess(item)
output.push(it)
})
await Promise.all(promises)
return res.json({ data: output })
}
const data = await Comments.find({ page_id: id }).sort({ post_date: -1 }).limit(6)
processArray(data)
更简化:-因为mongodb查询本身返回承诺,所以不需要使用新承诺
语法
async function processArray() {
const array = await Comments.find({ page_id: id }).sort({ post_date: -1 }).limit(6)
const output = []
const promises = array.map(async(item) => {
const it = await Users.findById(item.user).lean()
item.name = it.name
output.push(item)
})
await Promise.all(promises)
return res.json({ data: output })
}
什么是精益函数,我找不到引用mongoose返回mongoose对象,
lean()
用于将其转换为普通对象。感谢您的回复,您救了我的命,我发现这承诺
有点难以理解,我确信我不是一个人