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を利用する
- SQLITE3モジュールをインストール
npm install --save sqlite3
sqlite3 = require('sqlite3');
で読み込み- 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へ変換