У меня есть приложение Node.js / Express, которое запрашивает базу данных MySQL в маршруте и отображает результат пользователю. Моя проблема в том, как мне выполнить запросы и заблокировать их до тех пор, пока оба запроса не будут выполнены, прежде чем перенаправить пользователя на запрашиваемую страницу?
В моем примере у меня есть 2 запроса, которые необходимо завершить, прежде чем я визуализирую страницу. Я могу заставить запросы выполняться синхронно, если я вложу запрос 2 в обратный вызов 'result' запроса 1. Это, однако, станет очень запутанным, когда количество запросов увеличится.
Как мне выполнить несколько (в данном случае 2) запросы к базе данных синхронно без вложения последующего запроса в обратный вызов 'result' предыдущего запроса?
Я посмотрел на 'Flow control / Async goodies' в модулях Node и попробовал flow-js, но не могу получить он работает с асинхронными запросами.
Ниже перечислены 2 запроса, которые я пытаюсь выполнить из маршрута '/ home'. Могут ли эксперты по Node объяснить «правильный» способ сделать это.
app.get('/home', function (req,res) {
var user_array = [];
var title_array = [];
// first query
var sql = 'select user_name from users';
db.execute(sql)
.addListener('row', function(r) {
user_array.push( { user_name: r.user_name } );
})
.addListener('result', function(r) {
req.session.user_array = user_array;
});
// second query
var sql = 'select title from code_samples';
db.execute(sql)
.addListener('row', function(r) {
title_array.push( { title: r.title } );
})
.addListener('result', function(r) {
req.session.title_array = title_array;
});
// because the queries are async no data is returned to the user
res.render('home.ejs', {layout: false, locals: { user_name: user_array, title: title_array }});
});