Столкнулся с невероятной проблемой.
А невероятна она тем, что в ней на мой взгляд тут нечему ломаться потому как это основы, больше того, в других скриптах этого же проекта эта же задача выполняется превосходно а именно в этом - нет.
Речь идет о экспорте функции и получении доступа к ней через require.
Есть скрипт test.js и лежит он по пути Site/routes/test.js
В нем вот так определена тестовая функция:
function testFunc() {
return "Hello world!";
}
exports.testFunc = testFunc;
Так же есть другой скрипт socket.js который лежит по пути Site/lib/socket.js
Его содержимое (скрыт лишний код):
var test = require('../routes/test.js');
console.log(test.testFunc());
На этапе выполнения я получаю ошибку:
TypeError: test.testFunc is not a function
Ну что тут может быть не так?
При этом у меня есть еще 1 скрипт log.js который находится по пути Site/lib/log.js
Он подключен в скрипт socket.js таким же образом как и test.js
var log = require('../lib/log.js');
В скрипте log есть метод Debug который выводит сообщение в консоль + текстовый файл.
exports.Debug = function(msg) {
msg = GetDateTimeString() + " [DEBUG] " + msg;
console.log(msg);
fs.appendFile('logs.txt', msg + "\n", 'utf8', function (err) {
if(err) throw err;
});
}
И он спокойно вызывается из скрипта socket.js.
Ну как блин так 2 скрипта, оба подключаются одинаково в 1. Но при этом методы первого вызываются нормально а методы второго - выдают ошибку?
Пока писал, на ум пришло всего 2 варианта почему это может случиться. Единственные 2 разницы между подключаемыми скриптами.
1) В скрипт test.js подключается скрипт socket.js а потом выходит что в скрипт socket.js подключается test.js. С логом такого нет.
2) Может те скрипты что лежат в routes нельзя подключать из-за экспресса?
UPD: Первый вариант ложный. Подключил соккет в лог и это не повлияло на работу.
Второй вариант вроде верный. Создал другой файл в другой папке, перенес туда эту тест функцию из скрипта test.js и подключил в соккет. Результат: Работает нормально. Видимо из папки routes скрипты которые задействованы экспрессом подключать нельзя. Если кто может сформулировать это правило с объяснениями - буду рад.