2012-03-10 12 views
7

Estoy construyendo una aplicación en la que en una llamada en particular, debo bloquear y esperar los resultados de una consulta de autenticación antes de coninuar.nodeJS return value from callback

function authenticate(userid, hash) 
{ 
    mysql_client.query("SELECT `hash` FROM `auth` WHERE `userid` = " + userid, function selectCb(err, results, fields) { 
    if (err) 
    { 
     client.send("Error communicating with mysql, please retry your request"); 
     return false; 
    } 

    if(results.length == 0 || results[0].hash != hash) 
    { 
     client.send("Error comparing authentication data with database, please retry request"); 
     return false; 
    } 

    return true; 
} 
); 
} 

quiero ser capaz de devolver esos valores de la función de autenticación (pase) en sí, no el selectCb función anónima interna y tienen autenticar bloque hasta que la devolución de llamada se ha completado. ¿Cómo puedo hacer esto?

Respuesta

13

Su función externa necesita proporcionar una devolución de llamada que se puede ejecutar una vez que se realiza la llamada a mysql. Algo a lo largo de las líneas de esto:

function authenticate(user, pass, callback) { 
    mysql_client.query("...", function (err, results, fields) { 
     if (err) { 
      callback("Error communicating ..."); 
     } else if (results.length ...) { 
      callback("Error comparing authentication..."); 
     } 
     callback() 
    }); 
}); 

Ejemplo de uso:

authenticate('jim', '123456', function (err) { 
    if (err) { 
     alert(err); 
    } else { 
     alert('Welcome'); 
    } 
}); 
+0

Gracias, esto parece ser una solución interesante, sin embargo todavía estoy un poco inseguro cómo conseguir un valor fuera de este. Digamos que quiero que la solicitud se pare en este punto si falla la autenticación, de lo contrario continúe con la aplicación. Parece que cualquier cosa que devuelva en esa devolución de llamada también se comerá cuando las devoluciones de llamada devuelvan valor, por lo que tampoco podría simplemente devolver verdadero/falso a partir de esto. ¿Cómo voy a hacer eso? –

+0

@majicbunnie si una parte del flujo de la aplicación es asíncrona, eso hace que todo el lote sea asíncrono y debe tener devoluciones de llamada como esta en todo momento. Para simplificar esto y hacer que su código sea más fácil de trabajar, debe mirar un concepto llamado "futuro" o "promesa". Le evita crear devoluciones de llamada anidadas profundamente. Si lo busca, hay mucha información, pero puede comenzar aquí: http://howtonode.org/promises – nickf

+0

Lo mismo con OP. Sin utilizar Promises o similares, ¿cómo podría uno poder devolver esos valores desde la función authenticate() utilizando un programa simple? Pude entender la solución, pero me confundí con el uso del ejemplo. No parece responder a la pregunta de OP. – jagc