Как правильно экспортировать/требовать

Вопрос:

Я пытаюсь экспортировать одну функцию следующим образом:

exports.query = function(request){
conn.query(request, function(err, rows, fields){
if(err) console.log(err);
return rows[0].id;
});
}

и используя его:

var mysql = require('./mysql');
console.log(mysql.query('SELECT * FROM tablename'));

Таким образом, для получения результата подразумевается undefined как вывод. Как мне это исправить, пожалуйста?

Обратите внимание, что когда я просто console.log(rows[0].id) вместо return rows[0].id он отправляет обратно 123.

Заранее спасибо!

Лучший ответ:

В вашем примере вывод возвращается анонимной функции запроса базы данных вместо вызывающего модуля. Вы можете использовать обратный вызов для возврата вывода вызывающему модулю.

exports.query = function(request, callback){
    conn.query(request, function(err, rows, fields){
        if (err) {
            callback(err);
        } else {
            callback(null, rows[0].id);
        }
    });
}

Затем назовите его

var mysql = require('./mysql');
mysql.query('SELECT * FROM tablename', function(err, results){
    if (err) {
        console.error(err);
    } else {
        console.log(results);
    }
});

Ответ №1

Это проблема синхронизации.

функция conn.query возвращает undefined, поскольку она завершает свое выполнение до получения результатов (например, почти любая операция, связанная с i/o на js/node).

Одним из возможных решений для этого является предоставление обратного вызова вашей функции query.

exports.query = function(request, cb){
conn.query(request, function(err, rows, fields){
// some "special" processing
cb(err, rows, fields);
});
};

Если вы не знакомы с асинхронными функциями, ознакомьтесь с некоторыми статьями об этом:

http://justinklemm.com/node-js-async-tutorial/ https://www.promisejs.org/

Оцените статью
TechArks.Ru
Добавить комментарий