Вопрос не столько стоит в том, что вы не умеете готовить 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);
});
}