Nodos expresos / rutas y mysql

Estoy enfrentando un pequeño problema. Estoy tratando de hacer una pequeña API para comprobar si un usuario ya existe en mi base de datos.

Utilizo Express y rutas para que pueda consultar como ” http://example.com/check/user/john ” y debería mostrar: verdadero o falso dependiendo de si el usuario existe o no en la base de datos.

En mi archivo de ruta tengo el siguiente código:

var mysql = require('mysql'); var pool = mysql.createPool({ host: 'localhost', user: 'root', password: '123456', database: 'nodejs' }); module.exports = function(app){ app.get('/register/check/u/:username', function(req, res){ var output = 'false'; pool.getConnection(function(err, conn) { query = conn.query('SELECT * FROM users WHERE username LIKE ?', [req.params.username]); query.on('error', function(err){ throw err; }); query.on('result', function(row){ var output = 'true'; console.log(row.email); console.log(output); }); conn.release(); }); res.render('register/check_username', { output: output}); }); ); 

El problema es que res.render('register/check_username', { output: output}); siempre mostrará: false , pero en el registro de mi consola se muestra true cuando el usuario ya existe.

¿Alguna idea de por qué la variable de salida no se actualiza?

Solución: Como lo explicó akaphenom, el pool.getConnection se estaba inicializando en un proceso de no locking y, por lo tanto, mi primer código fue enviar automáticamente la salida como falsa. Aquí está el código de trabajo:

 app.get('/register/check/u/:username', function(req, res){ pool.getConnection(function(err, conn) { var output = 'false'; query = conn.query('SELECT * FROM users WHERE username LIKE ?', [req.params.username]); query.on('error', function(err){ throw err; }); query.on('result', function(row){ output = 'true'; }); query.on('end', function(result){ res.render('register/check_username', { output: output}); }); conn.release(); }); }); 

Creo que no estás permitiendo la naturaleza no bloqueante de estas llamadas. La variable se establece en falso, se llama a la conexión y luego se interrumpe hasta que se devuelva la llamada. Inmediatamente procesa la respuesta, antes de que se complete la callback.

 module.exports = function(app){ app.get('/register/check/u/:username', function(req, res){ // you set the value of the output var var output = 'false'; // this is a non-blocking call to getConnection which fires the callback you pass into it, once the connection happens. The code continues on - it doesn't wait. pool.getConnection(function(err, conn) { query = conn.query('SELECT * FROM users WHERE username LIKE ?', [req.params.username]); query.on('error', function(err){ throw err; }); query.on('result', function(row){ var output = 'true'; console.log(row.email); console.log(output); }); conn.release(); }); // you are getting here before the callback is called res.render('register/check_username', { output: output}); }); ); 

¿Por qué obtienes el valor correcto en la consola? Porque eventualmente se devuelve la llamada y realiza lo que esperas. Se acaba de llamar después de la entrega.

Esto es más probable que el código que desea:

 module.exports = function(app){ app.get('/register/check/u/:username', function(req, res){ pool.getConnection(function(err, conn) { query = conn.query('SELECT * FROM users WHERE username LIKE ?', [req.params.username]); query.on('error', function(err){ throw err; }); query.on('result', function(row){ var output = 'true'; console.log(row.email); console.log(output); res.render('register/check_username', { output: output}); }); conn.release(); }); }); );