データベース
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リクエストを2回目に実行すると、新しいデータベースデータで応答します。
[
{ "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について学びましょう。