我想找到一个用户,该用户的模型包含一系列城市(例如:[马德里,伦敦,莫斯科,布宜诺斯艾利斯等])
这是模型:
var UserSchema = Schema({
name: String,
surname: String,
userName: String,
email: String,
password: String,
rol: String,
suscriptionDate: Date,
cities:[String],
citiesPopulate:[]
});
找到用户后,我想遍历此数组以将每个城市用作参数,以查找我在模型City上拥有的信息,只是将坐标添加到user.citiesPopulate
function findUsersCities(req,res){
let id=req.body._id;
User.findById(id,function(err,userFound){
if(err){
console.log(err)
}else{
for(let i=0;i<userFound.cities.length;i++){
City.findOne({'city':userFound.cities[i]},function(err,citiesFound){
if(err){
console.log(err)
}else{
userFound.citiesPopulate.push(citiesFound.coords);
console.log(userFound)
}
})
}
}
})
}
而且,一旦将每个城市的所有信息都添加到userFound.citiesPopulate(现在只是带有一对坐标的数组),我想使用 res.status(200).send({userFound })在邮递员控制台上查看结果,如下所示(三个城市和三对坐标):
{ cities: [ 'Bilbao', 'Madrid', 'Barcelona' ],
citiesPopulate: [ [ -3.68, 40.4 ], [ -2.97, 43.25 ], [ 2.18, 41.38 ] ],
_id: 5c82c2e5cfa8d543d0133dd6,
name: 'pruebas35',
surname: 'pruebas35',
userName: 'pruebas35',
email: 'pruebas35@prueba.es',
password: '$2a$10$eSue5gw7r4dFPtwD8qzJhODcvvNFaRkeQYRAOPO9MCBsy3Djhkffq',
rol: 'user',
suscriptionDate: 2019-03-08T19:30:45.075Z,
__v: 0 }
但是,如果我在循环中键入 res.status ,则会将其发送出去,而我将无法获取全部信息。
我想知道一个解决方案。
答案 0 :(得分:1)
正如卡洛斯(Carlos)指出的那样,由于数据库请求的异步性质,因此无法使用。我这样做的方法是使用async / await使代码同步,如下所示:
branch1
请注意在theirproject
的回调函数中使用关键字function findUsersCities(req,res){
let id=req.body._id;
User.findById(id,async function(err,userFound){
if(err){
console.log(err)
}else{
try {
for(let i=0;i<userFound.cities.length;i++){
let cityFound = await City.findOne({'city':userFound.cities[i]});
userFound.citiesPopulate.push(cityFound.coords);
}
//complete userFound
console.log(userFound);
} catch (e) {
console.log(e);
}
}
})
}
。如果async
功能位于带有async关键字标记的函数中,则只能使用它。
此外,当您未为任何Mongoose查询函数指定回调函数时,它将返回Promise,并且只能在promises上使用await关键字。
如果promise解析,代码将继续运行,并且解析的值将在变量User.findById
中,否则(如果promise拒绝),它将抛出执行,因此代码将陷入catch语句,拒绝的值将在变量await
中。