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

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

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

Вот так выглядит код, чтобы получить переменную и экспортировать ее.

Файл 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.log(api.workingDirectory);

.unitv file

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

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

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

1 Ответ

0 голосов
/ 13 июня 2019

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