узел-соединение 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 ответ:
Вы не можете вернуть значение из асинхронного обратного вызова, как тот, который используется
query
. Вам нужно переписать queryToDatabase так, чтобы он принимал обратный вызов в качестве своего второго аргумента и вызывал его с помощьюrows
, когда запрос успешен. Тогда ваш основной код должен выглядеть следующим образом:queryToDatabase(query, function(result) { console.log(getTime() + "DB-Result Abfrage: " + result); });
На самом деле весь ваш код, который зависит от результата запроса, должен будет войти в этот обратный вызов.
На практике требуется, чтобы обратный вызов принимал два аргумента: состояние ошибки и a результат , со статусом ошибки
null
, если запрос был успешным.