Node.js: ссылка и изменение переменных из основного файла js в экспортированных экспресс-маршрутах - PullRequest
0 голосов
/ 21 марта 2019

Я работаю над бэкендом для программы домашней автоматизации, которую пишу в Node.js, используя экспресс в качестве маршрутизатора.В настоящее время у меня есть около 50 маршрутов для внешнего интерфейса для передачи информации в бэкэнд и из него, но эти маршруты иногда бывают довольно длинными, они охватывают различные аспекты программы (запрос и обновление состояний устройства, работа с действиями и сторонние API, такие какGoogle и Plex и т. Д.).Я планирую переместить мои маршруты в отдельные файлы, чтобы повысить удобочитаемость и способность поддерживать код / ​​маршруты, но я столкнулся с проблемой.Ниже приведен пример одного из моих маршрутов:

app.route('/api/devices/:deviceID/set/:state').get( async (req, res) => {
    if (!checkRequest(req, res)) return;

    var index = parseInt(req.params.deviceID);
    var device = devices[index];
    if (device === undefined) {
        res.status(404).json({error: 'DeviceNotExist'});
        return;
    }
    var state = req.params.state === '1' ? true : (req.params.state === '0' ? false : undefined);

    let d = await device_tools.setDeviceState(device, state, modules);
    if (d === undefined) {
        res.status(500).json({error: 'DeviceNotResponsive'});
        return;
    }
    let dd = getSendableDevice(d.deviceID);
    res.json(dd);
});

Как видите, сам маршрут зависит от массива объектов 'devices' и объекта 'modules', которые являются переменными в моем server.jsфайл.Тем не менее, есть несколько маршрутов (включая тот, что указан выше), которые изменяют сами объекты.Я обошел это раньше, требуя, чтобы функции вне server.js передавали им переменные (как в строке, которая вызывает setDeviceState из модуля device_tools), но поскольку маршруты не являются «функциями» в том смысле, чтоЯ могу назвать их, я не могу передать эти «глобальные» (они не глобальные, но я не знаю, как описать их область видимости, может быть, верхнего уровня?) Переменные конечным точкам API.К счастью для меня, я нахожусь в процессе полной реорганизации программы в любом случае (переходя от модулей к объектам ES6, которые могут инкапсулировать статические функции в классе объектов, а также определять и абстрагировать элементы данных объектов), поэтому яоткрыт для любых предложений, однако я предпочитаю придерживаться как можно более близкого к vanilla JS, поскольку я не хочу добавлять дополнительные зависимости, если смогу помочь.Если моего объяснения проблемы недостаточно, я более чем рад опубликовать больше кода и действительно разобрать его, если оно приблизит меня к решению.Заранее спасибо!

1 Ответ

0 голосов
/ 22 марта 2019

Вы можете создать модуль, который экспортирует нужные глобальные переменные .Импортируйте его во все модули, где вы их использовали.

Модули оцениваются только один раз, поэтому все ваши модули будут ссылаться на одни и те же переменные.

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