#node.js #mongodb #express #mongoose #async-await
#node.js #mongodb #экспресс #мангуст #асинхронное ожидание
Вопрос:
Поэтому я прохожу курс по Udemy, чтобы изучить веб-разработку с использованием Node/Express/MongoDB и использовать мангуста для взаимодействия с базой данных.
Я дошел до лекции, где инструктор начал объяснять, как запрашивать базу данных, поэтому здесь создал модель мангуста и назвал ее Tour
, а в файле контроллера он написал это, чтобы запросить данные, которые мы уже импортировали, вот так:
exports.getAllTours = async (req, res) =gt; { try { const queryObj = { ...req.query }; const exludedFields = ["sort", "limit", "page", "fields"]; exludedFields.forEach(el =gt; delete queryObj[el]); const query = Tour.find(queryObj); const tours = await query res.status(200).json({ status: 'success', data: { tours: tours } }) } catch (err) { res.status(404).json({ status: 'fail', message: err.message }); } }
Как вы можете видеть из приведенного выше кода, мы использовали функцию обработчика getAllTours
для получения всех туров, которые, кстати, обрабатывают этот маршрут app.get('/api/v1/tours/')
.
В начале лекции код запроса был таким: const query = await Tour.find(queryObj);
а затем он удалил await
ключевое слово, чтобы оно выглядело как приведенный выше код, если бы он позже включил await
ключевое слово для объекта tours.
Инструктор объяснил это, сказав, что если бы мы использовали ожидание в запросе, как это const query = await Tour.find(queryObj);
, то код будет выполнен немедленно, и тогда мы не смогли бы связать другие методы в запросе, такие как .where()
или .. equals()
Мне нужен кто-то, кто объяснит мне эти вопросы:
- почему код будет выполняться немедленно, если мы его используем
await
? Tour.find()
действительно нужно время, чтобы запросить базу данных , поэтому я думаю, что мы должны добавитьawait
, не так ли?
Ответ №1:
Tour.find()
Возвращает обещание (является асинхронным вызовом), добавление ожидания перед ним будет ждать, пока обещание не будет выполнено, и вернет его результаты.
Если вы хотите выполнить where() после выполнения поиска, вы можете сделать это после выполнения запроса, так как у вас будут результаты в этом объекте, в вашем случае в объекте tours.
Честно говоря, я предпочитаю const tours = await Tour.find()
, чтобы вы сохраняли переменную, которая является своего рода бесконечной, просто необходима, если вы хотите поймать ошибку в обещании или что-то в этом роде.
В вашем случае вы используете try catch, поэтому ошибка перейдет в блок catch, если что-то случится с запросом (проблемы с подключением или другие проблемы).
Комментарии:
1. Tour.find() требует времени для выполнения, поэтому я думаю, что мы должны добавить ожидание, прежде чем правильно? в приведенном выше коде он просто удалил его, почему? Я не хочу цеплять такие методы, как . где() или .равно() этому я просто удивлен, что он удалил ожидание.
2. Да, Tour.find() занимает некоторое время, чтобы перейти к базе данных и получить данные. так что ожидание Tour.find() будет в порядке. Если это ваш вопрос, пожалуйста, отметьте его как ответ 🙂
3. в этом-то все и дело, Диего, он его удалил! как?
4. Переменная запроса содержит обещание, возвращаемое Tour.find() когда вы выполняете ожидание запроса, вы ожидаете завершения запроса и возвращаете его результат, просто используйте другую переменную