iT邦幫忙

0

Day 9|跟記憶體陣列說再見:安裝 SQLite 並建立資料表

  • 分享至 

  • xImage
  •  

前八天的資料都活在記憶體陣列裡,伺服器一重啟就打回原形,這個問題拖了好幾天,今天終於要處理:讓 SQLite 接手保存資料。

今天做的事
安裝 sqlite3 套件後,另外寫了一個 db.js 管理資料庫邏輯:

const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database('./todos.db');

db.serialize(() => {
  db.run(`
    CREATE TABLE IF NOT EXISTS todos (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      title TEXT NOT NULL,
      done INTEGER DEFAULT 0
    )
  `);
  ...
});

接著把 server.js 裡的 GET /api/todos 改成從資料庫撈資料:

app.get('/api/todos', (req, res) => {
  db.all('SELECT * FROM todos', (err, rows) => {
    if (err) return res.status(500).json({ message: '資料庫錯誤' });
    res.json(rows);
  });
});

執行後資料夾裡多出一個 todos.db 檔案,瀏覽器打開 API,確認資料正常顯示。

卡關
今天GET改完後,想說順便測試一下第八天做的點擊切換完成功能還正不正常,結果點了待辦事項卻沒有出現刪除線,一度以為是自己改server.js的時候不小心刪到或動到前端相關的程式碼,來回檢查了好幾次index.html都找不出問題。
後來才想到:今天只改了GET /api/todos,但PUT /api/todos/:id(切換完成狀態)還是對著舊的記憶體陣列todos操作,而這個陣列在今天的改動裡已經被刪掉了。所以點擊事件本身沒有壞,是後端的PUT路由早就讀不到資料,才會沒反應——這其實是預期中會發生的狀況,不是我把程式碼改壞了。
這個經驗提醒我:改動一個功能前,要先想清楚這次改動影響的範圍到哪裡,GET改成資料庫了,不代表POST、PUT、DELETE也自動一起變了,它們彼此是獨立的程式碼,各自指向不同的地方,沒有互相連動的魔法。

心得
資料第一次真正活過伺服器重啟,打開todos.db這個檔案雖然看起來只是一個二進位檔案,但裡面裝的是目前所有待辦事項的真實狀態,跟前八天的陣列比起來,踏實感完全不同。
目前只有GET改好了,POST、PUT、DELETE都還是對著舊的陣列操作(其實已經沒作用了),這部分明天要一次處理完,讓新增、更新、刪除都真正寫進資料庫。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言