2013-08-20 4 views
0

Я продолжаю стучать головой о стену из-за множества различных ошибок. Это то, что код, который я пытаюсь использовать:Проблемы с файловой системой node.js

fs.readFile("balance.txt", function (err, data) //At the beginning of the script (checked, it works) 
{ 
    if (err) throw err; 
    balance=JSON.parse(data);; 
}); 
fs.readFile("pick.txt", function (err, data) 
{ 
    if (err) throw err; 
    pick=JSON.parse(data);; 
}); 

/*.... 
.... balance and pick are modified 
....*/ 

if (shutdown) 
{ 
     fs.writeFile("balance2.txt", JSON.stringify(balance)); 
     fs.writeFile("pick2.txt", JSON.stringify(pick)); 
     process.exit(0); 
} 

В конце сценария, файлы не были изменены малейшем. Затем я узнал, что на этом сайте, что файлы были открыты 2 раза одновременно, или что-то подобное, поэтому я попытался это:

var balance, pick; 
var stream = fs.createReadStream("balance.txt"); 
stream.on("readable", function() 
{ 
    balance = JSON.parse(stream.read()); 
}); 
var stream2 = fs.createReadStream("pick.txt"); 
stream2.on("readable", function() 
{ 
    pick = JSON.parse(stream2.read()); 
}); 

/**** 
****/ 

fs.unlink("pick.txt"); 
      fs.unlink("balance.txt"); 
      var stream = fs.createWriteStream("balance.txt", {flags: 'w'}); 
      var stream2 = fs.createWriteStream("pick.txt", {flags: 'w'}); 
      stream.write(JSON.stringify(balance)); 
      stream2.write(JSON.stringify(pick)); 
      process.exit(0); 

Но, на этот раз, оба файла пуст ... Я знаю, что я должен ошибки, но я просто не вижу, где проблема. Я не возражаю хранить 2 объекта в одном файле, если это может помочь. Кроме того, я никогда не делал javascript в своей жизни до вчерашнего дня, поэтому, пожалуйста, дайте мне простое объяснение, если вы знаете, что здесь не удалось.

+3

Добро пожаловать в удивительный мир ** асинхронном **! Вы не можете этого сделать. Используйте обещания или 'npm install async' – SLaks

+0

Вы имеете в виду, что я не могу сохранить объект в файле и перечитать его после? Я думал, что это принято делать? – pie3636

+0

Вы можете, но вам нужно дождаться завершения каждого шага. – SLaks

ответ

1

Что я думаю, что вы хотите сделать, это использовать readFileSync, а не использовать readFile для чтения ваших файлов, так как вам нужно их читать, прежде чем делать что-либо еще в вашей программе (http://nodejs.org/api/fs.html#fs_fs_readfilesync_filename_options).

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

Сделайте как код этого:

try 
{ 
    balance = JSON.parse(fs.readFileSync("balance.txt")); 
    pick = JSON.parse(fs.readFileSync("pick.txt")); 
} 
catch(err) 
{ throw err; } 

Я думаю, что вы получите функциональность, которую вы ищете, делая это.

Примечание: вы не сможете проверить свою ошибку так же, как с помощью readFile. Вместо этого вам нужно будет обернуть каждый вызов в try catch или использовать existsSync перед каждой операцией, чтобы убедиться, что вы не пытаетесь прочитать файл, который не существует.

How to capture no file for fs.readFileSync()?

Кроме того, у вас есть такая же проблема на записи. Вы начинаете асинхронные записи, а затем сразу вызываете process.exit (0). Лучшим способом сделать это было бы либо записать их последовательно асинхронно, а затем выйти или записать их последовательно синхронно, а затем выйти. Опция

Асинхронный:

if (shutdown) 
{ 
    fs.writeFile("balance2.txt", JSON.stringify(balance), function(err){ 
     fs.writeFile("pick2.txt", JSON.stringify(pick), function(err){ 
      process.exit(0); 
     }); 
    }); 
} 

Синхронизировать вариант:

if (shutdown) 
{ 
    fs.writeFileSync("balance2.txt", JSON.stringify(balance)); 
    fs.writeFileSync("pick2.txt", JSON.stringify(pick)); 
    process.exit(0); 
} 
+0

Я пробовал код, который вы мне дали, и чтение файла работает так же хорошо, как и раньше ... Затем я изменил только «баланс», а файл balance.txt был пуст в конце скрипта, а pick.txt был заменен ... Я в недоумении – pie3636

+0

О, я вижу это сейчас. Вы также вызываете process.exit (0) после вызова асинхронных вызовов записи. Я обновлю свой ответ, чтобы показать вам, как это сделать. – Brian

+0

Дайте мне знать, как это получается, я думаю, что это должно исправить ваши проблемы. – Brian

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