Как разделить переменную между двумя файлами, сгенерированными функцией

Я пишу API на NodeJS и столкнулся с кирпичной стеной. Я пытаюсь использовать функцию для захвата переменной и использования module.exports для использования указанной переменной в другом файле. Однако это продолжает появляться как неопределенное в консоли.

Я уже пробовал использовать операторы возврата в разных местах файла, но я продолжаю получать неопределенность.

Вот как выглядит код для захвата переменной и ее экспорта.

Файл 1 (api.js)

const fs = require('fs');
const homeDir = require('os').homedir();
module.exports = {
    workingDirectory: () => {
        let dir;
        fs.access(`${homeDir}/.unitv`, fs.constants.F_OK, (err) => {
            if (err) throw err;
            fs.readFile(`${homeDir}/.unitv`, 'utf8', (readErr, data) => {
                if (readErr) throw readErr;
                let jsonData = JSON.parse(data);
                dir = jsonData.WorkingDirectory;
            });
        });
        return dir;
    }
};

Файл 2

const api = require('../api');
console.info(api.workingDirectory);

.unitv файл

{
    "WorkingDirectory": "/home/user/UniTV",
    "Port": "3000"
}

В консоли он появится как undefined, когда он должен появиться со значением «рабочего каталога» в /home/user/.unitv.

Любая помощь приветствуется, спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш текущий код особенно проблематичен. return dir; происходит до того, как fs.access/fs.readFile заканчивается. Это асинхронные функции и требуют использования кодирования в стиле callback, promise или async/await. Суть его в том, что код продолжает выполнять другой код, пока он ожидает ввода-вывода (например, чтение файла), и то, как вы его написали, ничего не возвращает. См. https://repl.it/@CodyGeisler/readFileCallback для рабочего примера обратного вызова.

workingDirectory: () => {
    let dir;
    fs.access(`${homeDir}/.unitv`, fs.constants.F_OK, (err) => {
        if (err) throw err;
        fs.readFile(`${homeDir}/.unitv`, 'utf8', (readErr, data) => {
            if (readErr) throw readErr;
            let jsonData = JSON.parse(data);
            dir = jsonData.WorkingDirectory;
        });
    });
    return dir;
}

Другие вопросы по теме