Я использую fs.readFile
, чтобы читать содержимое config.json
в readCredentials.js
. Затем я экспортирую функцию, чтобы использовать ее config.js
.
Когда я запускаю node config.js
, я получаю два undefined
, а затем реальные значения username
и password
в config.js
. Любая идея, как я могу это исправить?
readCredentials.js
const fs = require("fs");
fs.readFile("./config.json", (err, data) => {
if (err) {
console.info(err);
}
const config = JSON.parse(data);
const username = config.username;
const password = config.password;
console.info(username, password);
module.exports = { username, password };
});
config.json
{ "имя пользователя": "xyz", "пароль": "xyz" }
config.js
const { username, password } = require("./readCredentials.js");
const usernameValue = username;
const passwordValue = password;
console.info(usernameValue, passwordValue);
Когда вы импортируете из readCredentials.js
, fs
все еще находится в процессе чтения файла. В вашем случае fs.readFileSync — это то, что вам нужно.
В модуле CommonJS вы не можете назначать module.exports
в результате какой-либо асинхронной операции. Это связано с тем, что весь процесс загрузки не ожидает завершения вашей асинхронной операции.
Таким образом, потребитель этого экспорта будет использовать его значение ДО того, как оно будет назначено вашей асинхронной операцией.
В модуле ESM и последней версии nodejs вы можете использовать верхний уровень await
с промисами для выполнения чего-то подобного.
Но, поскольку это всего лишь часть процесса загрузки модуля, вы можете просто переключиться на синхронный ввод-вывод с помощью fs.readFileSync()
или просто использовать require()
, который может автоматически загружать и анализировать .json
файлы и таким образом решать вашу проблему.
const { username, password } = require("./config.json");
module.exports = { username, password };
Самым простым выходом может быть использование вместо этого простого require
(он может отлично читать и анализировать файлы json). Альтернативой может быть readFileSync
, как указано выше.
readCredentials.js
const config = require("./config.json");
const username = config.username;
const password = config.password;
console.info(username, password);
module.exports = { username, password };
а) не используйте асинхронную версию
readFile
или б) регистрируйте импортированные значения только после того, как файл будет прочитан. Проще всего, когда вы экспортируете обещание для значений.