tl;dr всичко се случва при обратно повикване.
Вие се спъвате в асинхронния характер на Javascript. По времето, когато вашият console.log(value);
повикването се изпълнява, заявката не е (непременно) завършена. Така че няма начин резултатът от заявката да бъде наличен в този момент.
Много разработчици използват модел като този, с функция за обратно извикване, за да се справят със следващата стъпка, когато пристигне резултатът от заявката.
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
обекти правят този тип неща по-лесни за четене в node.js. Но обяснението им е извън обхвата на отговор на Stack Overflow.