Синхронные запросы к базе данных с помощью Node.js

У меня есть приложение 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 }});
});
52
задан Rick 6 July 2011 в 02:49
поделиться