Este é um erro comum entre iniciantes em async/nodejs. Você basicamente envolveu uma função assíncrona dentro de uma função de sincronização que decompõe a natureza do loop de eventos do nó. A expressão de retorno precisa ser substituída por um retorno de chamada. Veja abaixo:
// Method
function getUserInfo (userID, dynamicField, callback) {
var query = connection.query('SELECT '+dynamicField+' from users WHERE userID = '+connection.escape(userID));
query.on('result', function(row) {
callback(null, row.dynamicField);
});
};
// Implementation
getUserInfo(8, userEmail, function(err, result){
console.log(err || result);
});
Por convenção, no Nodejs sempre passamos um objeto de erro primeiro no retorno de chamada. Neste caso, como não há erro para capturar, passamos null em seu lugar.