mysql - NodeJS mysql 查询返回空结果

标签 mysql node.js http-request-parameters

我是 NodeJS 新手(废话!)。 我知道它异步执行函数,但我仍然看不出是什么导致了这种现象:

我正在使用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(fields) 输出了正确的字段!但为什么没有结果呢?

最佳答案

您向 validateUser 传递了错误的参数:

validateUser(REQ_PARAM_USER, REQ_PARAM_PASSWD, // ...

你真正想要的:

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

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

  • 您不必解析网址。 Express 会为您完成此操作,并且查询可通过 req.query 形式使用。
  • 您不应该在异步代码中抛出。它会带来意想不到的结果。相反,坚持将 (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], // ...
    

关于mysql - NodeJS mysql 查询返回空结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9904204/

相关文章:

php - 如何使用 php 从数据库中自行获取值?

mysql分钟到小时和分钟

php - 数组的数据多于应有的数据

mysql - 在 mysql 中执行带索引和不带索引的查询

python - 结合使用flask(或elasticsearch)和Node.js Web服务器是否有意义?

javascript - 从 JSON 文件接收 JavaScript 对象后正确访问它

java - 如何在循环中调用 httpconeection setRequestProperty android 到 setHeader?

java - Spring 参数不起作用

node.js - Node http-proxy/http-proxy-middleware - 如何操作代理响应

java - 在 Spring 中通过 @RequestParam 发送 %