Module.exports не дожидается исполнения callback. Как решить эту проблему?

Добрый день! Я новичок в NodeJS, есть файлы: main.js и db.js, подключаю db.js через require, после в main выполняю функцию, которая описана в db.js, но получаю undefined.

main.js:
var db = require('./db');
console.log('main.js: ' + db.test());

db.js:
var mysql = require('mysql');

var db = mysql.createPool({
	...
});

exports.test = function() {
	db.query("SELECT COUNT(*) FROM `users`", function(error, rows){
		console.log('db.js: ' + rows[0]['COUNT(*)']);
		return rows[0]['COUNT(*)'];
	});
}

Получаю следующие:
main.js: undefined
db.js: 4

Из-за чего это происходит?
  • Вопрос задан
  • 2372 просмотра
Решения вопроса 1
Abdusalamov
@Abdusalamov
Front-end разработчик
Вопрос не столько стоит в том, что вы не умеете готовить NodeJS, сколько в том, что вы не умеете готовить асинхронные запросы.

Нельзя возвращать результат из функции, как это сделали вы. db.query - асинхронная функция, ответ может прийти когда угодно, и к тому времени ваша конструкция return будет уже неактуальной, к тому же return находится в другой области видимости (анонимный колбек в db.query). Поскольку вы не возвращаете что-либо из функции test синхронно, по-умолчанию вы получаете undefined (отсутствие return равносильно return undefined).

Если не углубляться до модуля async, то решается это так:

main.js
var db = require('./db');
db.test(function(count){
    console.log('main.js: ' + count);
});

db.js
var mysql = require('mysql');

var db = mysql.createPool({
  ...
});

exports.test = function(callback) {
  db.query("SELECT COUNT(*) FROM `users`", function(error, rows){
    var count = rows[0]['COUNT(*)'];
    console.log('db.js: ' + count);
    (typeof callback != 'undefined') && callback(count);
  });
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы