データベース

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について学びましょう。