Почему мои контроллеры не экспортируются? - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь написать файл, который будет загружен, и автоматически экспортировать все мои контроллеры для проекта Express. По какой-то причине это не сработает. Я все еще довольно новичок в узле и Express. Вот код:

// export all controllers

const fs = require('fs');
const path = require('path');
const controllers = new Object();

(async () => {
    fs.readdir('./controllers', async (err, files) => {
        if (err) throw err;
        await 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;

Если я регистрирую свои экспорты в консоль, я получаю пустой объект, хотя я знаю, что код работает иначе. Для этого необходимо, чтобы все классы контроллеров были экспортированы, а затем экспортированы в объект с именами классов в качестве ключей и самих классов в качестве значений.

1 Ответ

1 голос
/ 24 февраля 2020

В настоящее время вы не можете использовать асинхронные операции для создания вещей, которые вы собираетесь экспортировать. Экспорт выполняется синхронно, но на момент экспорта ваш объект 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 по-прежнему назначается, и модуль возвращается до того, как было назначено какое-либо из свойств экспорта вашего модуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...