NodeJS MySQL запрос возвращает пустой результат - PullRequest
0 голосов
/ 28 марта 2012

Я новичок в NodeJS (да!).Я знаю, что он выполняет функции асинхронно, но я до сих пор не вижу, что вызывает это явление:

Я использую модули Express и MySQL и пытаюсь выполнить запрос SQL на основе параметров запроса.Предполагается, что это простая функция API проверки, когда сервер будет искать пользователя в базе данных, прослушивая определенный URL-адрес для двух параметров запроса (user и passwd).

Проблема в том, что SQL-запрос всегда возвращает пустой объект как результат, когда я делаю это, используя параметры запроса в запросе.

Однако, , если я жестко закодирую запрос и запускаю его вне приложения.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 (поля) выводит правильные поля!Но почему не результаты?

1 Ответ

2 голосов
/ 28 марта 2012

Вы передаете неправильные параметры validateUser:

validateUser(REQ_PARAM_USER, REQ_PARAM_PASSWD, // ...

Что вы действительно хотите:

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

Редактировать: Несколько других проблем с вашим кодом:

  • Вам не нужно анализировать URL. Express делает это за вас, и запрос доступен как req.query.
  • Вы не должны throw в асинхронном коде. Это даст неожиданные результаты. Вместо этого придерживайтесь парадигмы nodejs, передающей (err, results) всем обратным вызовам, и выполняйте надлежащую проверку ошибок там, где вы можете - т.е. в вашем 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], // ...
    
...