資料庫
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。