Node.jsにnedb用のWrapperクラスとファンクションを作る
目的?
何をするにもデータの取り回しは大切、ということでjavascriptで簡単にDB用の諸々を準備します。
NEDBを利用してファイルDBとメモリDBを構築しやす。
nedb 1.8.0
node 10.16.0
ファイル構成
ライブラリ用ディレクトリ └db ├ files │ └ definition.db ├ nedb_wrapper.js ├ file_db_controller.js └ mem_db_controller.js
Wrapperクラスを作る
まずはコンストラクタでファイルDB/メモリDBそれぞれの設定が出来るようにする。
let DataStore = require('nedb'); module.exports = class { constructor(filename) { this.memonly = false; if (!filename) this.memonly = true; else if (typeof filename !== 'string') console.log('filename is not string. :' + filename); // DBコネクション生成 if (!this.memonly) { this.db = new DataStore({ filename: filename, inMemoryOnly: this.memonly, timestampData: true, autoload: true, onload: err => { if(!err) return; console.log('database load error. : ' + err); } }); } else { this.db = new DataStore({ inMemoryOnly: this.memonly, timestampData: true }); } /** 同一のDBを利用するためにコネクションをここから取得する */ this.GetConnection = this.db; } //クエリ定義エリア //ココから共通的に使うクエリを定義していく。 }
this.memonlyフラグでインスタンス化のときにファイル指定があるかを確認、生成するDBの種類を変更する。
一応ファイル名の型チェックを行い、文字列以外であればエラーログを出す。
memonly=falseの場合はファイルDBとして定義し(ifルート)trueの場合はオンメモリDBの設定を定義する(falseルート)
最後にthis.GetConnectionに定義したDBコネクションを渡して完了。
上記コードの最後、クエリ定義エリアに下記の様にクエリを定義する。
今回はinsertとselectを作ってみます。
insertQuery(query) { return new Promise((docs) => { this.db.insert(query, function (err, res) { if (res || !err) docs(res); else console.log("[insertQuery]error : " + err); }); }); } findAllQuery(query) { return new Promise((docs) => { this.db.find(query, function (err, res) { if (res || !err) docs(res); else console.log("[findAllQuery]error : " + err); }); }); }
どちらもqueryにJSON型のパラメータを指定して利用します。
ココまでをnedb_wrapper.jsとして保存します。
ファイルDB用コントローラ
definition.dbというファイルを読み込み、または生成してファイルDB用インスタンスを生成します。
let DataBase = require('./nedb_wrapper'); const fs = require('fs'); const path = require('path'); const filepath = path.resolve(__dirname, '../') + '/db/files/definition.db'; try{ fs.statSync(filepath); console.log('db file exist.'); }catch(err){ fs.writeFileSync(filepath, ''); console.log('db file created.'); } const db = new DataBase(filepath); module.exports = db;
メモリDB用コントローラ
細かい設定はWrapper側でやっているので、メモリ用に生成する場合はファイルパスにNullを指定して呼び出します。
let DataBase = require('./nedb_wrapper'); const filepath = null; const db = new DataBase(filepath); module.exports = db;
使い方
使い方としては読み込み対象をfile/memのどちらかを選択する以外は共通です。
queryは適当なJsonパラメータ(ex {key:"keyword"}など)
const db = require('./db/file_db_controller'); const query = { key: "keyword" } db.findAllQuery(query, db.GetConnection).then(paramList => {/*なにか処理*/});