Tech 4 Mine :-) 忘れぬ先のテックメモ

ゆるエンジニアな私が、多少なり役に立ったひらめきやらTipsを忘れる前に書いていくブログです。

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 => {/*なにか処理*/});