「Node.js超入門」の感想・備忘録3

スポンサーリンク
「Node.js超入門」の感想・忘備録2の続き

HTTPクライアント

var https = require('https');
https.get({
    host: 'www.google.com',
    port: 443,
    path: '/'
  }, (res2) => {
    var body = '';
    res2.on('data', (data) => {
        body += data;
    });
    res2.on('end', () => {
      res.render('httpClient', {body: body});
    });
  });

XMLをJSONに変換したい場合は、xml2jsモジュールを使う。

SQLite

SQLiteを利用する

  1. SQLITE3モジュールをインストール
    npm install --save sqlite3
  2. sqlite3 = require('sqlite3');で読み込み
  3. Databaseオブジェクトを生成
    var db = new sqlite3.Database('データファイル名');
sqlite3 = require('sqlite3');
var db = new sqlite3.Database('データファイル名');
db.rerialize(() => {
  db.all(""select * from hoge where id < ?""), [10], (err, rows) => {
    if (!err) {
      res.render('rows', rows); 
    }
  });
});

SQLiteの操作

取得

  • Databaseオブジェクトのserialize()のコールバック内に処理を記述
    ※serialize()は複数の処理が重なって実行されないようにしてくれるdb.serialize(関数);
  • db.all("SQL", 値配列, 関数);で全件取得
  • db.get("SQL", 値配列, 関数);で1行取得
db.rerialize(() => {
  db.all("select * from hoge where id < ?"), [10], (err, rows) => {
    if (!err) {
      res.render('rows', rows); 
    }
  });
});
db.rerialize(() => {
  db.get("select * from hoge where id=?", [100], (err, row) => {
    if (!err) {
      res.render('row', row); 
    }
  });
});

登録/更新/削除

  • db.run("SQL", 値配列, 関数)
db.run("insert into hoge(name, age) values(?, ?)", ["hoge", 38]);

Bookshelf

Bookshelfとは

複数のDBに対応したORマッパーモジュール。
利用するには2つのモジュールのインストールが必要。

  • knex:クエリビルダ
    npm install --save knex
  • bookshelf:Bookshelf本体
    npm install --save bookshelf 
var knex = require('knex')({
    dialect: 'sqlite3',
    connection: {filename: 'データファイル名'},
    useNullAsDefault: true// SQLiteの場合だけ必要
});
var Bookshelf = require('bookshelf')(knex);
var Hoge = Bookshelf.Model.extend({tableName: 'hoge'});

// 以下、Express Generatorアプリケーションの場合
router.get('/', (req, res, err) => {
    new Hoge().fetchAll().then((baseModels) => {
        res.render('hello', {data: baseModels.toArray()});
    }).catch((err) => {
        res.status(500).json({error: true, data: {message: err.message}});
    });;
});

テンプレートでは以下のようにattributesプロパティで値の参照が可能。

<% for (var i in data) { ?>
    <p><%= data[i].attributes.name ?>:<%= data[i].attributes.age?>歳</p>
<% } ?>

Bookshelfでレコード保存

モデルのコンストラクタにオブジェクトを渡してsaveメソッドを実行すると値が保存されるる。
Expressアプリケーションの場合、req.bodyを渡すとPOST値がそのままセットされる。

router.post('/add', (req, res, next) => {
    new Hoge(req.body).save().then((model) => {
        res.redirect('/hello');
    });
});

Bookshelfで検索

  • 全件取得
    new モデル名().where().fetchAll().then()((baseModels) => {});
  • 1件取得
    new モデル名().where().fetch().then()((baseModel) => {});

※fetchAll()はbaseModelオブジェクト配列、fetch()はbaseModelを返却する

  • whereメソッドは引数に列名, 不等号, 値を受け取る。
    (OR条件はqueryというメソッドを使う必要がある)
    new Hoge().where('id', '=', 100).fetch().then((baseModel) => {
  • orderByメソッドでソート
    new Hoge().orderBy('id', 'DESC').fetchAll().then((baseModel) => {

Bookshelfのpaginationプラグイン

Bookshelf標準にはページ分け機能はない。
Bookshelfのプラグインという形で提供されている。
⇒npmのでインストールは不要。ソースにプラグイン読み込みの記述を追加するだけ。

// 読み込み
Bookshelf.plugin('pagination');

new モデル名().fetchPage({page: 1, pageSize:3}).then()((baseModels) => {
    res.render('hello', {pagination: baseModels.pagination});
});
// テンプレートではpagination.pageやpagination.pageCountとして使う。

Bookshelfの命名規則

usersテーブルの場合(テーブル名は複数形)

  • id
  • message_id:別テーブルのプライマリキー
  • created_at
  • updated_at

モデル作成時にhasTimestampsをtrueにするとcreated_atとupdated_atは自動保存される

var Message= Bookshelf.Model.extend({
    tableName: 'users',
    hasTimestamps: true
});

Bookshelfのアソシエーション

モデル作成時にbelongsToなどを定義する。

var User = Bookshelf.Model.extend({
    tableName: 'users',
    hasTimestamps: true
});
var Message= Bookshelf.Model.extend({
    tableName: 'messages',
    hasTimestamps: true,
    user: function() {
        return this.belongsTo(User);
    } 
});

データ取得時はfetchやfetchPageにwithRelated配列を指定する。
(fetchAllはドキュメントに記述されていないが使うことができるのこと。よくわからない。。)

// Expressアプリケーションの場合
new Message().fetch({withRelated: ['user']}).then()((baseModel) => {
    res.render('hello', {message: baseModel});
});

Expressアプリケーションの場合、テンプレートでは<%= message.relations.user.attributes.name %>で取得可能

markdownモジュール

markdown⇔HTMLの変換が可能。

  • npm install --save markdownでインストール
  • var markdown = require("markdown").markdown;で読み込み&オブジェクト取得
  • markdown.toHTML(text);でHTMLへ変換

コメント