Как получить результаты из nodejs, используя пакет mysql?

#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);
    }
});
  

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

Предлагаемый ответ, похоже, добавляет только еще одну функцию?