資料庫

Mirage 資料層的核心是一個簡單的記憶體資料庫。此資料庫儲存 Mirage 的所有初始狀態,然後您的路由處理器會在您使用應用程式時存取和修改該狀態。

資料庫讓 Mirage 能夠模擬生產伺服器,讓您能夠在應用程式中編寫完整的動態功能。

您的大部分 Mirage 程式碼不會直接存取資料庫,而是會透過 Mirage 的 ORM 與其互動。我們將在這些指南的下一節中介紹 ORM。

現在,讓我們學習資料庫的基礎知識,以便您即使大部分程式碼最終都使用 ORM,也能有信心直接與其互動。

基本用法

Mirage 的資料庫實際上只是一個帶有一些慣例的 JavaScript 物件。它可以從您的 server 實例存取

let server = createServer()

server.db // {} the db is empty

您可以對其呼叫 loadData 以使用一些資料初始化它

server.db.loadData({
  movies: [
    { title: "Interstellar" },
    { title: "Inception" },
    { title: "Dunkirk" },
  ],
})

loadData 採用一個物件,其鍵對應於資料庫表格,而其值表示資料庫記錄的陣列。

資料庫會自動為新記錄指派 ID (您也可以提供自己的 ID)。我們可以使用受 MongoDB 啟發的 API 來存取我們的資料

// Get all movies
server.db.movies // [ { id: '1', title: 'Interstellar' }, { id: '2', title: 'Inception' }, { id: '3', title: 'Dunkirk' } ]

// Get the first movie
server.db.movies[0] // { id: '1', title: 'Interstellar' }

// Insert a new movie
server.db.movies.insert({ title: "The Dark Knight" })

Mirage 有一個 seeds 方法,這是一個在開發期間將一些初始資料放入伺服器的慣例位置。您可以在那裡對資料庫呼叫 loadData

createServer({
  seeds(server) {
    server.db.loadData({
      movies: [
        { title: "Interstellar" },
        { title: "Inception" },
        { title: "Dunkirk" },
      ],
    })
  },
})

真正的威力來自於在您的路由處理器中存取資料庫。您可以使用 schema 引數來取得它

this.get("/movies", (schema, request) => {
  return schema.db.movies
})

此路由處理器現在會回應請求時 Mirage 資料庫中的所有資料。這表示如果您從此資料開始;

[
  { "id": "1", "title": "Interstellar" },
  { "id": "2", "title": "Inception" },
  { "id": "3", "title": "Dunkirk" }
]

但隨後撰寫一個新的路由處理器,將資料插入 movies 集合

this.post("/movies", (schema, request) => {
  let attrs = JSON.parse(request.requestBody)

  return schema.db.movies.insert(attrs)
})

並使用您的應用程式建立一部新電影,則您的應用程式第二次向 /movies 發出 GET 請求時,它會回應新的資料庫資料

[
  { "id": "1", "title": "Interstellar" },
  { "id": "2", "title": "Inception" },
  { "id": "3", "title": "Dunkirk" },
  { "id": "4", "title": "The Dark Knight" }
]

如同您將在下一節學到的,大多數的路由處理器會與 schema ORM 物件互動,而不是較底層的資料庫物件,但知道資料庫的存在以備不時之需仍然是件好事。

您最常直接使用資料庫的地方是在測試中,您可以使用 server.db 來存取它。驗證您的應用程式的網路請求是否發送正確的資料,對 Mirage 資料庫的狀態進行斷言會很有用。

test("I can create a movie", async function (assert) {
  await visit("/movies/new")
  await fillIn(".title", "The Dark Knight")
  await click(".submit")

  assert.dom("h2").includesText("New movie saved!")
  assert.equal(server.db.movies[0].title, "The Dark Knight")
})

您可以在 API 參考中檢視其餘的資料庫 API。


接下來,讓我們來了解 Mirage 的 ORM。