2016-05-25 3 views
-1

Я экспортировать следующий объект, который инициализирует свои данные из файлаУзел экспорт объекта с данными из файла

function wordsBox(){ 
    this.words= {}; 
} 

var w = new wordsBox(); 

fs.readFile('words.txt', function (err, data) { 
    w.words = JSON.parse(data.toString()); 
}); 

module.exports = w; 

Однако, когда я пытаюсь получить доступ к данным из другого файла, его не читает.

var wordsBox = require('../db/word.reader'); 
console.log(wordsBox.words); 

Следующее выдает пустой объект. Поэтому, все равно, чтобы экспортировать объект после того, как fs закончил чтение данных.

+0

в «другом» файле, вы не подождали достаточно долго, чтобы readFile в модуле завершился. Поскольку вы не дали себе обещания или обратного вызова для работы, вам нужно будет с помощью setTimeout (или изменить модуль для обратного вызова) –

+0

- лучший способ вызвать обратный вызов, когда readFile будет завершен? –

+0

Я бы не сказал, что это «лучший» способ, но это один из двух способов. –

ответ

1

Вы должны использовать синхронизацию версию fs.readFile:

... 
var data = fs.readFileSync('words.txt') 
w.words = JSON.parse(data.toString()) 

, требующую («загрузка») другие модули синхронной операции. Если вы хотите заполнить свои данные из внешних ресурсов, вам также нужно сделать это синхронно. Тем не менее, я рекомендую использовать явную (и необязательно асинхронную) инициализацию модулей, чтобы использовать тестирование и избегать неожиданных побочных эффектов.

+0

спасибо, что мне нужно –

Смежные вопросы