我想获得数据库中每个商店的用户数量。所以我在我的Db中打了两个电话,一个用于商店,另一个用于用户。我有一个问题,我在" nbr_users"中没有任何东西。返回值..你能帮忙吗?
function nbr_users(key) {
return new Promise((resolve, reject) => {
db.User.find({
shop: key
}, (err, users) => {
if (err) reject(err)
else {
resolve(users.length) // Maybe my problem is here...
}
})
})
}
module.exports = (req, res) => {
db.Account.find({},
(err, accounts) => {
if (err) res.json(err)
else {
var accountMap = {}
var i = 0;
accounts.forEach(async function(account) {
accountMap[i++] = {
users: await nbr_users(account.key) // the value I want
}
});
res.json({user_list: accountMap})
}
})
}
答案 0 :(得分:1)
您从nbr_users(key)
返回了一些内容。您有承诺,然后您可以使用.then
。
因为您处于异步循环中。功能,你不想忘记i
我建议你使用匿名Immediately-invoked function expression。
function(i){
nbr_users(account.key).then(function(length){
accountMap[i] = {
users: length
})
}(i++);
答案 1 :(得分:0)
accounts.forEach(async function(account) {
accountMap[i++] = {
users: await nbr_users(account.key) // the value I want
}
});
应该更像
var accountMap = {}
var i = 0;
for (let account of accounts) {
let users = await nbr_users(account.key);
accountMap[i++] = {
users: users
}
}
res.json({user_list: accountMap});
确保您在async
功能中运行该功能。
这种方式的缺点是每个后续nbr_users(account.key)
请求必须等待前一个请求。有一种方法可以运行它们,而不是每个人都在等待前一个,让我知道你是否希望我这样表现出来 - 它稍微复杂一些