2013-04-28 1 views
1

У меня [от новых до node.js и программирования в целом] есть два результата запроса mysql (информация о членах и список семинаров, на которых могут присутствовать участники) чтобы отправить их на номер res.render(), который будет представлен в шаблоне .jade (страница редактирования страницы).Отправка нескольких результатов запроса в res.render() с помощью node-mysql и mysql-queue

Для этого я использую модули node-mysql и mysql-queue. Проблема в том, что я не знаю, как передать функцию обратного вызова для отображения ответа до завершения queue.execute(), поэтому я сделал обходной путь и поставил первые два запроса в очереди (функция mysql-queue), выполнил очередь, а затем добавил третий «фиктивный запрос ", который имеет функцию обратного вызова, которая отображает шаблон.

Мой вопрос: могу ли я использовать это обходное решение и что было бы правильным путем с помощью этих модулей?

exports.memberEdit = function (req, res) { 

    var q = connection.createQueue(); 

    var membersResults, 
     htmlDateSigned, 
     htmlBirthDate, 
     servicesResults; 

    q.query("SELECT * FROM members WHERE id= ?;", req.id, function (err, results) { 
     console.log("Članovi: " + results[0]); 
     membersResults = results[0]; 
     htmlDateSigned = dater.convertDate(results[0].dateSigned); 
     htmlBirthDate = dater.convertDate(results[0].birthDate); 
    }); 

    q.query("SELECT * FROM services", function (err, results) { 
     console.log("Services: " + results); 
     servicesResults = results; 
    }); 

    q.execute(); 

    // dummy query that processes response after all queries and callback execute 
    // before execute() statement 
    q.query("SELECT 1", function (err,result) { 
    res.render('memberEdit', { title: 'Edit member', 
           query:membersResults, 
           dateSigned:htmlDateSigned, 
           birthDate:htmlBirthDate, 
           services:servicesResults }); 
}) 
}; 

ответ

1

Я думаю, что альтернативой может быть использование transaction, чтобы обернуть ваши запросы с:

var trans = connection.startTransaction(); 
trans.query(...); 
trans.query(...); 
trans.commit(function(err, info) { 
    // here, the queries are done 
    res.render(...); 
}); 

commit() позвонит execute()и он обеспечивает функцию обратного вызова, которая будет вызываться, когда все функции обратного вызова запроса сделано.

Это все еще немного обходное решение, было бы разумнее, если бы execute() предоставил возможность передачи обратного вызова (но это не так). В качестве альтернативы вы можете использовать модуль, который обеспечивает реализацию Promise, но это все еще обходное решение.

+0

Это работает, спасибо! –