Я пишу 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.
Любая помощь приветствуется, спасибо.
Ваш текущий код особенно проблематичен.
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;
}