2012-03-28 244 views
0

我是NodeJS(Duh!)的新手。 我知道它执行异步的功能,但我仍然无法看到是什么原因导致了这种现象:NodeJS mysql查询返回空结果

我使用express和mysql模块,并试图根据请求参数执行SQL查询。它应该是一个简单的验证API功能,其中服务器将通过监听特定的URL来查询两个请求参数(用户和密码),从而在数据库中查找用户。

问题是,SQL查询总是返回一个空对象作为结果,当我在查询中使用请求参数执行此操作时。

但是,如果我硬编码查询并在app.get(...)之外运行它,我会得到期望的结果!但我需要这对需要定制工作...

(我不打算使用GET请求以后,这个例子是用于调试目的:))

我在做什么错这里?

这里是我的代码:

// Server and Mysql setup here 
var app = require('express').createServer(), 
    SERVER_PORT = 8080; 
var Client = require('mysql').Client, 
    client = new Client(), 
    ... 
// User, password and database setup here, cropped out from this example // 
// ... 

function validateUser(user, passwd, callback) { 
client.query('SELECT date FROM '+CUSTOMERS_TABLE+' WHERE email="'+user+'" AND passwd="'+passwd+'";', 
    function selectCb(err, results, fields) { 
     if (err) { 
      throw err; 
     } 
     console.log(fields); 
     callback(results); 
    }); 
} 

app.get('/', function(req, res){ 
var url_parts = url.parse(req.url, true); 
var query = url_parts.query; 
if((typeof query[REQ_PARAM_USER] != 'undefined' && typeof query[REQ_PARAM_PASSWD] != 'undefined') 
     && (query[REQ_PARAM_USER] != '' && query[REQ_PARAM_PASSWD] != '')) { 
     validateUser(REQ_PARAM_USER, REQ_PARAM_PASSWD, function(results) { 
      console.log(results); 
     }); 
    } 
    res.end("End") 
}); 
app.listen(SERVER_PORT); 

console.log('Server running at port '+SERVER_PORT); 

哦,顺便说一下,执行console.log(场)输出正确的领域!但为什么不结果呢?

回答

2

您传递错误的参数validateUser

validateUser(REQ_PARAM_USER, REQ_PARAM_PASSWD, // ... 

你真正想要的:

validateUser(query[REQ_PARAM_USER], query[REQ_PARAM_PASSWD], // ... 

编辑:其他一些问题与您的代码:

  • 您不必解析网址。 Express为你做这件事,并且查询是可利用的为req.query
  • 您不应该在异步代码中使用throw。它会带来意想不到的结果。相反,请坚持传递(err, results)到所有回调的nodejs范例,并在可能的地方进行适当的错误检查 - 即在verifyUser中,将错误与callback一起传递,并检查get处理程序中的错误。或者res.send(500)(或其他)发生错误,或通过调用next(err)将它传递给快速错误处理程序。

    validateUser(query[REQ_PARAM_USER], query[REQ_PARAM_PASSWD], function(err, results) { 
        if(err) { 
         console.error(err); 
         res.send(500); 
        } else { 
         console.log(results); 
         res.send(results); 
        } 
    }); 
    
  • 不要直接将查询参数传递给像SQL查询之类的东西。而是使用SQL查询的参数:

    client.query('SELECT date FROM '+CUSTOMERS_TABLE+' WHERE email=? AND passwd=?', [user, passwd], // ...