TypeScript
ionic
NeDB

ionicでnedb使ってみた

More than 1 year has passed since last update.

what is nedb

JavaScirptで書かれたファイルデータベース
JSONテキストがそのままテキストファイルとして保存されるという剛毅なDB
https://github.com/louischatriot/nedb

ionicで使うって正気ですか

予めionicプロジェクト展開したディレクトリで、 npm で入れる

$ npm install nedb --save
$ ionic serve

以下コード
ionicでProviderとして使う想定で書いてみた
importはめんどくさいんで as にしたけどd.tsあるはずなのでちゃんと名前使えるかも

import { Injectable } from "@angular/core";
import * as Datastore from "nedb";

@Injectable()
export class NedbProviderSample {
  filename: string = "data/database.db";
  dataStore: Datastore;
  constructor() {
    console.log("Hello ChatLogProvider Provider");
    this.dataStore = new Datastore({ filename: this.filename, autoload: true });
  }

  /**
   * レコードの新規作成
   * @param document Object 書き込むドキュメントをJSONオブジェクトで指定
   * @return targetKey:string 発行されたレコードキーをstringで返す
   */
  public create(document: object): Promise<object> {
    return new Promise((resolve, reject) => {
      this.dataStore.insert(document, (error, result) => {
        if (error) {
          reject(error);
        } else {
          resolve(result);
        }
      });
    });
  }

  /**
   * レコードの削除
   * @param targetKey 削除対象のレコードキー
   * @return bookean 削除の成否をbooleanで
   */
  public delete(targetKey: string): Promise<boolean> {
    return new Promise((resolve, reject) => {
      this.dataStore.remove({ _id: targetKey }, {}, (error, result) => {
        if (error) {
          reject(error);
        } else {
          resolve(result);
        }
      });
    });
  }

  /**
   * レコードの検索
   * @param param0 {
   *  targetFieldName : 検索対象のフィールド名
   *  queryString: 検索に使用されるクエリ文字列
   * }
   * @return Array<object> 検索結果をドキュメントObjectのArrayで
   */
  public findRecords({ targetFieldName: targetFieldName, queryString: queryString }): Promise<Array<object>> {
    return new Promise((resolve, reject) => {
      let queryObject;
      if (queryObject) {
        queryObject = { targetFieldName: queryString };
      } else {
       // find()に渡す検索オブジェクトを空っぽにすると、全件返ってくる
        queryObject = {};
      }
      this.dataStore.find(queryObject, (error, result) => {
        if (error) {
          reject(error);
        } else {
          resolve(result);
        }
      });
    });
  }
}

こんな感じで読み書き検索できる
実際に使うとなると都度 findRecord() して全件取り直さないといけないのですごい遅いと思う

実用性?

さあ....?
mongodbみたいなAPI経由でのnoSQL使いたいんだけどサーバプロセス立てるのめんどくさい、みたいな時に使う程度だと思う
堅牢性とか速度とか言い出してはいけない

todo

ファイルが実際にはどこに書き込まれているのか調べる
セキュリティホール作り放題の可能性あり