2014-04-10 94 views
2

我正面临一个小问题。我试图做一个小API来检查用户是否已经存在于我的数据库中。nodejs express/routes和mysql

我使用快递和路线,所以我可以像“http://example.com/check/user/john”查询,它应该输出:true或false,取决于用户是否存在于数据库中。

在我的路线文件,我有下面的代码:

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

的问题是,res.render('register/check_username', { output: output});总会输出:false,但在我的控制台登录它显示true当用户已经存在。

任何想法为什么输出变量没有更新?

解决方案: 正如akaphenom所解释的,pool.getConnection被初始化为一个非阻塞的进程,因此我的第一个代码自动地将输出发送为false。这里的工作代码:

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

回答

4

我相信你不允许这些调用的非阻塞性质。变量设置为false,连接被调用,然后通过等待回调。您在回拨完成之前立即提供回复。

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

为什么你在控制台中获得正确的值?因为最终这个回调被调用并且执行你期望的。它只是叫res.render

后,这很可能是你想要的代码:

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

感谢。我不确定非阻塞的东西,用你的答案更好地理解它。 –

+0

NP如果它适合您,请接受答案,以便其他人同样面临困难,因为您知道这是一个合适的解决方案。 – akaphenom