Вы должны быть в состоянии сделать это в одном запросе. Похоже, что вы используете мангуст, поэтому попробовать что-то вроде этого:
User.find({ email: { $in: emails } }, function(err, results) {
if (err) return res.send(err);
res.send(results);
});
Стоит также отметить, что Javascript однопоточен. Это означает, что много операций происходит асинхронно, то есть вам нужно дождаться завершения операции, прежде чем вы сможете двигаться дальше. Вышеупомянутый оператор ведения журнала консоли не дожидается завершения операции с базой данных. Вы должны дождаться выполнения функции обратного вызова.
UPDATE: Также заметили, что вы перебираете emails
, но затем используете project.students[i]
в каждой итерации. Я не могу видеть остальную часть вашего кода, но это просто глючный код. Вы должны либо зацикливаться на project.students
, либо, используя emails[i]
в каждой итерации.
ОБНОВЛЕНИЕ 2: Похоже, что вы хотите отправить больше, чем просто массив пользователя с ответом. Итак, первая цель - использовать один запрос с помощью оператора $in
(см. Пример выше - вы должны иметь возможность передавать список писем в mongoose). Все, что связано с монго, вы всегда хотите уменьшить количество запросов к базе данных, если вы вообще не заботитесь об эффективности. Вторая задача - переформатировать ваших пользователей и другие данные соответственно:
var finalResponse = { token: "12341234", users: null };
User.find({ email: { $in: emails } }, function(err, results) {
if (err) return res.send(err);
if (!results.length) return res.send(finalResponse);
// OPTION 1: Array of users (recommended)
finalResponse.users = results;
// OPTION 2: users object, keyed by the users email
finalResponse.users = {};
results.forEach(function(user) {
finalResponse.users[user.email] = user;
});
// FINALLY, send the response
resp.send(finalResponse);
});
Вы определяете 'users' как объект, почему вы ждете его становится массивом? –