tl;dr tudo acontece em um retorno de chamada.
Você está tropeçando na natureza assíncrona do Javascript. No momento em que seu
console.log(value);
chamada é executada, a consulta não é (necessariamente) concluída. Portanto, não há como o resultado da consulta estar disponível naquele momento. Muitos desenvolvedores usam um padrão como esse, com uma função de retorno de chamada para lidar com a próxima etapa quando o resultado da consulta chegar.
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
objetos tornam esse tipo de coisa mais fácil de ler em node.js. Mas explicá-los está além do escopo de uma resposta do Stack Overflow de qualquer maneira.