はじめに
Vaporアプリケーションの操作にも慣れてきました。まだまだですけどね。ControllerやView関係をやっていないのでね。
APIを叩くのはPostman頼みになりますが、もともとの目的であるVaporアプリケーションからMongoDBへアクセスし、データの読み書きをしてみたいと思います。
ところが、実際やってみるとなかなか上手く進まないもので。地道に進めます。
パッケージの導入
VaporでMongoDBにアクセスするためにはパッケージを導入が必要です。投稿時点での安定バージョンは0.3.0
、最新のリリースは1.0.0-rc1
です。
.package(url: "https://github.com/mongodb/mongo-swift-driver.git", from: "0.3.0")
ここで注意したいのが、パッケージのバージョンです。
安定バージョンの0.3.0
は、Vapor3に対応しています。ですが、後々の話になりますけれども、使えるメソッドが1.0.0-rc1
よりも少ないです。MongoDBからドキュメントを取得すると、いわゆるドキュメントを指すカーソルが返ってくるのですが、そこからドキュメントをまとめて配列にすることができるtoArray
メソッドが使えないのは困りどころ。0.3.0
ではループを回して対応です。
そこで、1.0.0-rc1
を使おうとすると、今度はVapor3が対応していないんです。Vapor4にしないといけない。でも、Vapor4は正式にリリースされていないようで、β版っぽいです。少しVapor4を使ってみましたが、Vapor3とは扱いがだいぶ異なり、戸惑いました。また、扱い方が不味いのか1.0.0-rc1
を入れるとビルドが通らなかったです(´・ω・`)
ちなみにVapor4はβ版である旨の明記は見当たらないですが、導入時にvapor
コマンドではなくvapor-beta
コマンドを使わないといけないのでβ版という書き方をしました。β版じゃないかもしれない。
今の時点では、素直にVapor3で安定バージョンの0.3.0
を使うのが良いと思います。使い勝手やセキュリティ的な意味も含めて後々のことを考えると、新しいものを使っていくのがよいとは思いますが、私自身は現段階では見送り判断です。種々のパッケージもどんどん新しいバージョンがリリースされているようなので、最新情報を常時チェックしていきたいところです。
targets
にMongoSwift
を追加し、ビルドします。エラーが出なければOKです。
接続のための設定をする(configure.swift)
下準備
SQLiteでも出てきたconfigure.swift
をMongoDB用に書き換えていきます。SQLiteの文字が出てくるものを片っ端から消すことになります。最終的にMiddleware
とRouter
に関するもののみ残ります。ただし、現時点で消してしまうとRouterでエラーが出てしまうと思いますので、後で消すということで後ろの方に消すものを寄せておくぐらいにしておきます。
ちなみにMigration
ですが、これは後々で必要になると思います。ですが、今は消しておきます。お家芸になりつつある問題の先送りです。
クライアントのインスタンスを作る
let client = try MongoClient("mongodb://[ユーザ名]:[パスワード]@[ホスト名]:[ポート番号]")
MongoDBに接続するためのクライアントを作ります。MongoDBを立てているサーバのIPとポート番号を指定してください。MongoDBへのアクセスにパスワード等認証必須としている場合はユーザ名とパスワードも忘れず指定してください
それと必要に応じてcatchもお願いしますね。
データベースを作る
let db = client.db("[データベース名]")
接続先のデータベース名を指定します。ここで指定して、VaporアプリケーションをRunすると自動的に生成されます!便利!
コレクションを作る
let collection = try db.createCollection("[コレクション名]")
コレクションを作ります。今回はFluentSQLiteのを流用するので、Booksコレクションになるでしょうか。
これも必要に応じてcatchもお願いしますね。
サービスに登録
configre
メソッド内の書き方を真似るような形になりますが、ここで作ったクライアントインスタンスをサービスに登録します。
services.register(client)
MongoClientをVaporのServiceプロトコルに準拠させる
仕上げに、MongoClient
をVaporのService
プロトコルに準拠させておきましょう。
extension MongoClient: Service {
}
中身には自分自身でなにか書く必要は今の所ありません。何を書くんでしょうね?
まとめ
最初のバージョン問題でだいぶ気力を持っていかれました。疲労感が半端ねぇ。ここまでで特段エラーが出ていないようなのでひとまずOKでしょう。