循环后如何发送头

时间:2019-03-08 22:20:52

标签: node.js mongoose

我想找到一个用户,该用户的模型包含一系列城市(例如:[马德里,伦敦,莫斯科,布宜诺斯艾利斯等])

这是模型:

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 ,则会将其发送出去,而我将无法获取全部信息。

我想知道一个解决方案。

1 个答案:

答案 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中。