В настоящее время вы не можете использовать асинхронные операции для создания вещей, которые вы собираетесь экспортировать. Экспорт выполняется синхронно, но на момент экспорта ваш объект controllers
еще не был заполнен какими-либо свойствами.
Таким образом, модуль, который импортирует вас, получит пустой объект (который в конечном итоге будет заполнен, но, вероятно, будет пустым при попытке его использовать).
Поскольку это только В коде инициализации модуля простое решение состоит в том, чтобы использовать синхронный файловый ввод-вывод вместо асинхронного файлового ввода-вывода, чтобы объект контроллеров получил свои свойства, назначенные до его экспорта.
Инициализация модуля - один из немногих случаев, когда все в порядке и, возможно, даже желательно использовать синхронный файловый ввод-вывод на сервере. Фактически, require()
использует синхронный файловый ввод / вывод по той же причине.
const fs = require('fs');
const path = require('path');
const controllers = {};
const files = fs.readdirSync('./controllers');
files.forEach(file => {
if (file !== 'index.js') {
const i = path.basename(file).indexOf('.');
const fn = path.basename(file).slice(0, i);
controllers[fn] = require(path.join(__dirname, file));
}
});
module.exports = controllers;
PS Использование async
и await
здесь ничем не помогает. Вы не ожидаете обещания, и функция async
по-прежнему не блокируется, поэтому module.exports по-прежнему назначается, и модуль возвращается до того, как было назначено какое-либо из свойств экспорта вашего модуля.