Как отправить заголовки после цикла - PullRequest
0 голосов
/ 09 марта 2019

Я хочу найти пользователя, чья модель содержит массив городов (например: [Мадрид, Лондон, Москва, Буэнос-Айрес и т. Д.])

Это модель:

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).отправить ({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.статус в цикл, он отправлен, и я не могу получить всю информацию.

Я хотел бы узнать решение для этого, пожалуйста.

1 Ответ

1 голос
/ 09 марта 2019

Как отметил Карлос, это не сработает из-за асинхронного характера запросов к базе данных.Я бы сделал это, используя async / await, чтобы сделать код синхронным, например:

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 в функции обратного вызова из User.findById.Функцию await можно использовать только в том случае, если она находится внутри функции, помеченной ключевым словом async.

Кроме того, когда вы не указываете функцию обратного вызова для какой-либо функции запроса Mongoose, она возвращает Promise, и вы можете использовать только ключевое слово await для обещаний.

Если обещание разрешается,код продолжит выполняться, и разрешенное значение будет находиться в переменной cityFound, в противном случае (если обещание отклонено), оно сгенерирует исключение, поэтому код попадет в оператор catch, а отклоненное значение будетв переменной e.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...