узел-соединение mysql.query() возвращает undefined


Я использую сервер node ws, построенный на einaros/ws. Этот сервер должен отправлять запросы в базу данных. Для этого я используюfelixge/node-mysql .

Когда пользователь подключается к серверу, он должен быть проверен, если клиент все еще существует в базе данных.

Вот интересный фрагмент кода:

console.log("client-liste ist leer");
var query = "SELECT name FROM spieler WHERE name='"+id+"' AND passwort='"+passwort+"'";
var result = queryToDatabase(query);
console.log(getTime() + "DB-Result Abfrage: " + result);

И код, в котором выполняется запрос:

var mysql = require('mysql');
var mysqlConnection = mysql.createConnection({
    host: dbHost,
    user: dbUser,
    password: dbPassword,
});

function queryToDatabase(anfrage) {
    mysqlConnection.connect();

mysqlConnection.query("USE " + db, function(err, rows, fields) {
    if (err) throw err;
});

mysqlConnection.query(anfrage, function(err, rows, fields) {
        if (err) throw err;
        console.log("rows as String - " + JSON.stringify(rows));
        return rows;

    });

    mysqlConnection.end();
}

Журналы в консоли следующие:

Клиент-liste ist leer
3.8.2012-15: 29: 0-DB-результат Abfrage: неопределенный
строки как строка - [{"name": "lukas"}]



Кто-нибудь понимает, почему функция возвращает undefined? Я также попытался дождаться завершения подключения к базе данных с помощью простого setTimout, но ничего не изменилось!

1 3

1 ответ:

Вы не можете вернуть значение из асинхронного обратного вызова, как тот, который используется query. Вам нужно переписать queryToDatabase так, чтобы он принимал обратный вызов в качестве своего второго аргумента и вызывал его с помощью rows, когда запрос успешен. Тогда ваш основной код должен выглядеть следующим образом:

queryToDatabase(query, function(result) {
     console.log(getTime() + "DB-Result Abfrage: " + result);
   });

На самом деле весь ваш код, который зависит от результата запроса, должен будет войти в этот обратный вызов.

На практике требуется, чтобы обратный вызов принимал два аргумента: состояние ошибки и a результат , со статусом ошибки null, если запрос был успешным.