Я пытаюсь экспортировать одну функцию следующим образом:
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);
}
});
Это проблема синхронизации.
функция 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/