我是NodeJS的新手(呃!)。 我知道它执行函数异步,但我仍然看不出是什么导致了这种现象:
我正在使用express和mysql模块,并尝试根据请求参数执行SQL查询。它应该是一个简单的验证API功能,服务器将通过侦听两个请求参数(user和passwd)的特定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(fields)输出正确的字段!但为什么不结果?
答案 0 :(得分:2)
您将错误的参数传递给validateUser
:
validateUser(REQ_PARAM_USER, REQ_PARAM_PASSWD, // ...
你真正想要的是什么:
validateUser(query[REQ_PARAM_USER], query[REQ_PARAM_PASSWD], // ...
修改:您的代码还有其他一些问题:
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], // ...