query.on没有在Node.js中返回任何结果

时间:2014-09-09 03:06:47

标签: mysql node.js

我正在尝试使用以下代码验证用户:

function validateUser(adminEmailId, adminPassword) {
    try{
        console.log('email id: '+adminEmailId+' password: '+ adminPassword);
        var connection = mysql.createConnection({
                                                host: 'localhost',
                                                user: 'root',
                                                password: 'somePassword',
                                                database: 'someDatabase'
                                                });

        var query = connection.query('select id from AdminData where adminEmail = "'+adminEmailId+'" AND adminPassword = "'+adminPassword+'"');
        console.log('query: ' + query);

        query.on('error', function(error){
                 console.log('A db error occurred: '+error);
                 });
        query.on('result', function(result){
                 console.log('some result: '+ result);
                 if(result.id === null) {
                 console.log('user not found');
                 }
                 else
                 {
                 console.log('user found :)');
                 }
                 });
    }
    catch (ex) {
        console.log('some exception ' + ex);
    }

}

它在控制台中打印的最后两个日志是 -

email id: d@g.com password: gfdgdf 
query: [object Object]

应该打印 -

user not found 
// OR
user found :)

我尝试通过在命令行中触发来验证SQL是否正常运行:

mysql -h127.0.0.1 -uroot -p

它向我显示错误:

Command not found

所以我使用下面的命令更新了路径:

export PATH="/usr/local/mysql/bin:$PATH"

然后我可以从命令行使用mysql,但仍然没有在Node.js代码中取得成功:(

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

如果您的查询没有导致errorresult个事件,则表示查询导致空集。您应该监听end事件,以便了解查询何时执行。然后,您可以在result上检查的end事件处理程序中设置一些条件,以查看是否找到了用户。

执行此操作可能更简单的方法是将回调传递给query(),因为在这种情况下您似乎不需要进行流式传输。类似的东西:

connection.query('select id from AdminData where adminEmail = "'+adminEmailId+'" AND adminPassword = "'+adminPassword+'"', function(err, rows) {
    if (err) {
      console.log('A db error occurred: ' + err);
      return;
    }
    if (rows && rows.length)
      console.log('user found :)');
    else
      console.log('user not found');
});

另外我应该指出其他一些事情:

  • 您不应该将用户提交的数据连接到SQL查询字符串中,因为它会使您容易受到SQL注入攻击。您应该至少转义值,但建议使用真实的预处理语句。 mysql模块当前不支持实际准备好的语句,但mysql2确实如此。 mysql2mysql API兼容,整体速度更快。
  • 您应该在validateUser()参数列表的末尾添加一个回调参数,以便在查询完成后调用回调,从而允许您适当地继续执行代码。否则调用validateUser()的地方将不知道查询何时完成以及结果是什么。