tl;dr wszystko dzieje się w oddzwonieniu.
Potykasz się o asynchroniczną naturę JavaScript. Do czasu, gdy Twój console.log(value);
wywołanie zostanie uruchomione, zapytanie nie jest (koniecznie) zakończone. Nie ma więc możliwości, aby wynik zapytania był dostępny w tym czasie.
Wielu programistów używa wzorca takiego jak ten, z funkcją wywołania zwrotnego do obsługi następnego kroku po otrzymaniu wyniku zapytania.
function quo (success){
value = connection.query(
'SELECT role from `roles` where `id` = 1' ,
function (error, results, fields) {
if (error) throw error;
console.log('The role is: ', results[0].role);
success (results[0].role);
});
}
quo (function (role) {
console.log(role);
/* do something useful with the role that came back from the query */
});
Promise
obiekty ułatwiają czytanie tego typu rzeczy w node.js. Ale wyjaśnienie ich i tak wykracza poza zakres odpowiedzi na przepełnienie stosu.