はじめに
ちょっと前まで仕事でkotlin+androidを使ってアプリを作っていたのですが、androidアプリを作ると当然のようにiPhoneアプリの開発依頼が来ます。
もともとandroidアプリを作る前はCakePHPで作ったアプリを使ってもらっていました。
ですが、WEBアプリは通信ができない場所では使い物にならないため、通信障害に強いアプリにする必要があり、androidアプリを作成した背景があります。
作ったのは良いのですが、WEBも現役で使ってもらいながら、androidアプリも使ってもらうとなると、一つ機能を追加するたびにWEBとandroidの両方を修正する必要があります。
ここにiPhoneも加わると、ソースコードの3重持ちになって大変です。
WEBとandroidアプリくらいなら何とかなるかなーと思っていましたが、2重持ちだけでも結構大変です。
ここにiPhoneアプリが加わると、これは、もう無理かな…と。
そんなときにangularやreactやらの情報を得て、いろいろ試している最中です。
angularやreactは基本的にRestAPIとの連携になるので、サーバーサイドはnodeJS+expressでやってみようと試みたわけです。
さらにDBはNoSQLのMongoDBを使ってみようかなと考えました。
しかし、CakePHPやdjangoと違って非同期ベースのせいか、中々癖がすごい。
とりあえず、ありきたりな記事ではありますが、自分の脳内整理のためにメモを残していこうかなということで記事を書くことにしました。
というか、本当は急に文章を書きたくなっただけです。
いきなり脱線 angularとreactの違い
これもよくある話ですが、angularとreactの違いについて、少しだけ書いておこうと思います。
angularとreact、どっちを選べばいいのか?という点について、自分なりの見解を書いてみたいと思います。
どちらを選ぶべきかは、自分がどちらの入り口に立っているかで馴染みやすさに差が出ると思います。
angularは、kotlinでandroidアプリを作ったことがある人にとってはreactよりもなじみやすいと思います。
jetpackの双方向バインディングなど、機能の用語や考え方が似ているので、「あれのことか」みたいにあたりが付きやすいです。
typescirptとkotlinも似ている感じがあります。
rskotlinを使っている人は代替にrsJSが使えます。
kotlinの代わりにjavascriptでandroidアプリを作る感覚に近く、あまりjavascriptっぽくない感じがします。
ただ、androidアプリもそうですが、ライブラリのインポートの設定とかが邪魔くさいところがあります。
一方のreactは、素のjavascriptでcreateElementとかを駆使して動的にフォームを作ったり、ローカルストレージを使って何か作ったりしたことがある人は、reactのほうが理解しやすいと思います。
素のjavascriptを使いやすくした感じで、javascirptはわかっているよーという人向けな気がします。
ようするにkotlinでアプリを作ったことがない人で、javascirptゴリゴリ派はreact、kotlinで作ったことがある派はangularから入ると理解しやすいのかなーと思っています。
どっちもやったことがないやーって人はreactかなー…?
そういえばvueという選択肢もあるみたいですが、これは触ったことがないです。
ライブラリのインストール
mongoDBのライブラリはいくつかあるみたいですが、とりあえず原始的っぽいmongodbを使うことにします。
npm install mongodb
これでOK。
データベースに接続する
loginのページにgetの要求が来たら、DBに接続して切断するだけのコードが以下です。
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
router.get("/login", function(req, res, next) {
dbURL = 'mongodb://127.0.0.1:27017/';
dbName = 'sampledb';
MongoClient.connect(dbURL, (err, db)=> {
if(err) throw err;
//ここに接続した後にやりたいことを書く。
db.close();
});
}
非同期接続になるんですね。
ページにアクセスするたびにconnectを出してcloseするのがセオリーなのか、どこかに接続ハンドルを持たせてハンドルを使いまわすのが正解なのかはちょっとわからない。
できれば、ミドルウェアで接続を管理できるとよいのだけど。
データを取得する
データを取得して、取得したデータをコンソールに出力する場合のコードは以下。
router.get("/login", function(req, res, next) {
let userName = req.params.userName;
let password = req.params.password;
MongoClient.connect(dbConfig.dbURL, (err, db)=> {
if(err) throw err;
var dbo = db.db(dbConfig.dbName);
dbo.collection('test').find().toArray(function(err, result){
if(!err) {
res.json({"error_code": 0, "message": "This is a test.", records: result});
}
else {
res.json({"error_code": 1, "message": "record is nothing.", records: []});
}
db.close();
});
});
});
ポイントはfindも非同期で呼び出す点。ちなみにレコードが見つからなくてもtoArrayに指定した関数はコールされる模様。
そのため、findの中にdb.closeを入れています。
う~ん、なんか危なっかしいな…。
↧