nodejs express / routes et mysql

Je suis confronté à un petit problème. J’essaie de créer une petite API pour vérifier si un utilisateur existe déjà dans ma firebase database.

J’utilise express et routes pour pouvoir interroger le type ” http://example.com/check/user/john ” et générer le résultat: true ou false selon que l’utilisateur existe ou non dans la firebase database.

Dans mon fichier de route, j’ai le code ci-dessous:

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}); }); ); 

Le problème est que res.render('register/check_username', { output: output}); affichera toujours: false , mais dans le journal de ma console, il indique true lorsque l’utilisateur existe déjà.

Une idée de pourquoi la variable de sortie n’est pas mise à jour?

Solution: comme expliqué par akaphenom, le pool.getConnection était initialisé dans un processus non bloquant et mon premier code envoyait donc automatiquement la sortie en faux. Voici le code de travail:

 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(); }); }); 

    Je crois que vous n’autorisez pas la nature non bloquante de ces appels. La variable est définie sur false, la connexion est appelée, puis est en attente de rappel. Vous rendez immédiatement la réponse, avant la fin du rappel.

     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}); }); ); 

    Pourquoi obtenez-vous la bonne valeur dans la console? Parce que finalement, le rappel est appelé et effectue ce que vous attendez. Il est simplement appelé après le res.render

    C’est plus probablement le code que vous voulez:

     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(); }); }); );