#mysql #node.js
#mysql #node.js
Вопрос:
сначала я подключаю базу данных и выбираю DB:
var defaultOptions = {
user: "root",
pwd:'admin',
db:"britcham_dev_local",
server:"local", // Maybe we don't need this variable.
};
var client = new Client();
client.user = defaultOptions.user;
client.password = defaultOptions.pwd;
client.connect(function (error, results) {
//
});
client.query('USE ' defaultOptions.db, function (error, results) {
//
});
Во-вторых, я запрашиваю с помощью объекта client:
var self = this;
var this.users;
client.query("SELECT * FROM users", function (error, results, fields) {
if (error) {
//
}
if (results.length > 0) {
self.users = results;
}
});
console.log(this.users);
это ничего не выводит??? Почему??
Комментарии:
1. Вы получаете ошибку при подключении и выборе базы данных?
Ответ №1:
Поскольку node.js является неблокирующим и асинхронным, тогда в этом коде:
client.query("SELECT * FROM users", function (error, results, fields) {
if (error) {
//
}
if (results.length > 0) {
self.users = results;
}
});
console.log(this.users);
вероятно, данные из базы данных еще не загружены в переменную users, когда вы пытаетесь войти в консоль. Вы можете проверить это, выполнив свою console.log
операцию внутри запроса, например:
client.query("SELECT * FROM users", function (error, results, fields) {
if (error) {
//
}
if (results.length > 0) {
console.log(results);
}
});
Чтобы передать результат в переменную по завершении операции, вы можете обернуть вызов вашей клиентской базы данных в функцию с параметром обратного вызова и установить свою переменную при вызове обратного вызова, например:
function query(sql, callback) {
client.query(sql, function (error, results, fields) {
if (error) {
//
}
if (results.length > 0) {
callback(results);
}
});
}
query("SELECT * FROM users", function(results) {
self.users = results;
console.log(self.users);
});
Приведенный выше код — это просто концепция.
Комментарии:
1. Небольшой комментарий, но вы говорите, что «данные из базы данных, вероятно, не загружены …». На самом деле данных там никогда не будет, верно? (поскольку в node есть только один поток выполнения, и этот поток не будет доступен для выполнения обратного вызова до тех пор, пока не будет вызван console.log (this.users))
2. @Geoff: Данные будут там после того, как они будут извлечены из базы данных, но в то время, когда консоль. вызывается log (в исходном коде), переменная users по-прежнему пуста. Если консоль. операция регистрации обернута, например, в setTimeout, тогда пользователи должны содержать результаты из DB.
3. Да, извините, я не имел в виду, что никогда, никогда — просто это никогда не будет там до консоли. вызов журнала. Другими словами, это не условие гонки (поскольку существует только один поток).
Ответ №2:
Чем предлагаемый ответ отличается от этого?
var self = this;
var this.users;
client.query("SELECT * FROM users", function (error, results, fields) {
if (error) {
//
}
if (results.length > 0) {
self.users = results;
console.log(this.users);
}
});
Возможно, я ошибаюсь, это не отличается от предложенного ответа тем, что он записывает в консоль не раньше, чем мы получим данные обратно из базы данных.
Предлагаемый ответ, похоже, добавляет только еще одну функцию?