前提・実現したいこと
スタート、ストップ、クリアの3つのボタンのある簡単なストップウォッチアプリで、経過時間をmemory.jsonに保存し、ブラウザを更新しても更新前の経過時間から計測を再開できるようにしたいです。
手順としては、fsモジュールをインストールし、経過時間を示すelapsedTime変数をfs.writeFileSync
を用いてJSON形式でmemory.jsonに保存、アプリ起動時にreadFileSync
を用いて読み出したデータをelapsedTimeに代入するということを考えました。
発生している問題・エラーメッセージ
アプリが動かなくなる。(スタートボタンを押しても反応しない。)
該当のソースコード
javascript
1var timer = document.getElementById('timer'); 2var start = document.getElementById('start'); 3var stop = document.getElementById('stop'); 4var clear = document.getElementById('clear'); 5 6var startTime = 0; 7var elapsedTime = 0; 8var memoriedTime = 0; 9 10const fs = require('fs'); 11const fileName = './memory.json'; 12 13try { 14 const data = fs.readFileSync(fileName, 'utf-8'); 15 elapsedTime = parseInt(JSON.parse(data)); 16} catch (ignore) { 17 console.log(fileName + 'から復元できませんでした'); 18} 19 20function saveTime() { 21 fs.writeFileSync(fileName, JSON.stringify(elapsedTime), 'utf8'); 22} 23 24function updateTimeText() { 25 var m = Math.floor(elapsedTime / 60000); 26 var s = Math.floor(elapsedTime % 60000 / 1000) 27 var ms = elapsedTime % 1000; 28 29 m = ('0' + m).slice(-2); 30 s = ('0' + s).slice(-2); 31 ms = ('0' + ms).slice(-3); 32 33 timer.innerText = m + ':' + s + ':' + ms; 34 saveTime(); 35} 36 37function countUp() { 38 timerID = setInterval(() => { 39 elapsedTime = Date.now() - startTime + memoriedTime; 40 updateTimeText(); 41 }, 10); 42} 43 44start.addEventListener('click', () => { 45 startTime = Date.now(); 46 countUp(); 47 updateTimeText(); 48}); 49 50stop.addEventListener('click', () => { 51 clearInterval(timerID); 52 memoriedTime = elapsedTime; 53}) 54 55clear.addEventListener('click', function () { 56 elapsedTime = 0; 57 memoriedTime = 0; 58 timer.innerText = "00:00:000" 59}) 60
試したこと
javascript
1const fs = require('fs'); 2const fileName = './memory.json'; 3 4try { 5 const data = fs.readFileSync(fileName, 'utf-8'); 6 elapsedTime = parseInt(JSON.parse(data)); 7} catch (ignore) { 8 console.log(fileName + 'から復元できませんでした'); 9} 10 11function saveTime() { 12 fs.writeFileSync(fileName, JSON.stringify(elapsedTime), 'utf8'); 13}
この部分をコメントアウトすると動くのですが、原因が分かりません。やり方自体もやや冗長かもしれません。解決方法あるいは別の方法をご教示くださる方いらっしゃいましたらよろしくお願いします。
補足情報(FW/ツールのバージョンなど)
node.js
express
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/19 16:09