9月 162015
 

状況に応じてフォームの送信先URL(formタグのaction属性値)のクエリーストリングを書き換えるという処理をするために、こんなJavaScriptを書いてみた。

function updateQuery(query)
{
  var form = document.forms[0]
    , action = document.createElement('a')
  ;

  // オリジナルの送信先URLからパス部分を切り出して、クエリーストリングだけを書き換える。
  action.href = form.getAttribute('action');
  form.setAttribute('action', action.pathname+'?'+query);
}

しかし、

  • フォームを表示しているページのURLがWebサイトのルート直下ではない
  • オリジナルのフォームの送信先URLが絶対パスで書かれている

という条件下では、フォームを送信した時にIEでだけ「404 Not Found」になってしまった。

Continue reading »

10月 142012
 

express-resourceを使って効率よくREST APIを実装できるようにするためのexprestというnodeパッケージをNPMで公開してみた。と言っても、リリースしたのは2ヶ月も前の話。使い方などはREADME.mdに英語で書いておいたが、英語が苦手な人のために日本語の対訳を書いておこう。

Continue reading »

8月 262012
 

設計編からだいぶ間があいてしまったが、routes/auth.jsに枠組みだけ作ったauthモジュールの実装を埋めていこう。

スタート地点はこの段階。

module.exports = function(models) {
  var User = models.user;

  return {
      signup: function(req, res) {
      }

    , login: function(req, res) {
      }

    , logout: function(req, res) {
      }
  };
};

Continue reading »

7月 282012
 

Sequelizeを使う準備が整ったところで、どんなWebアプリを作るにしても避けて通れないであろうユーザー認証の仕組みを実装していく。

大まかな流れはこんな感じ。

  1. Userモデルを定義する
  2. 認証モジュールを設計する
  3. リクエストのルーティングを追加する
  4. 認証モジュールを実装する

Continue reading »

7月 212012
 

7月20日に催されたJTPAギークサロン「青木淳氏とNode.js/Herokuを体験する」にボランティアのテクニカルサポートスタッフとして参加してきた。JTPAでのハッカソンは、Hadoopで始める並列データ解析以来。参加者は各々ラップトップを持ち込み(参加者の9割がMacというのがシリコンバレーらしい)、ガイドに従いながらプログラムを書いていくわけだが、Hadoopの時と同様に参加者のプログラミングスキルはバラバラ。自分でWebサービスを作ったことがある人もいれば、プログラムを書いたことがないという初心者もいたけれど、ホスト役の青木氏の素晴らしいファシリテーションで、時間内に全員が「heroku上でMySQLを使ったnodeアプリを動かす」というゴールに辿り着くことができた。

Continue reading »

7月 012012
 

それでは中編で棚上げしていたsyncメソッドを提供するAPIの実装を書いていこう。

Sequelizeのサンプルを見てもわかるように、syncメソッドはimportメソッドによってインスタンス化されたモデルオブジェクトに対する呼び出し(Project.sync)と、Sequelizeオブジェクトに対する呼び出し(sequelize.sync)の2パターンある。モデルオブジェクトに対してsync()を実行すると、対応するテーブル定義だけが構築される。 Sequelizeオブジェクトに対してsync()を実行すると、データベース全体が構築される。また、sync()の引数に{ force: true }を渡すと、既存のテーブルを一旦削除(DROP)してゼロからテーブルを作り直す(再構築)。

Continue reading »

6月 232012
 

前編では、Sequelizeをインスタンス化するために自前でdbconnモジュールを作って、app.jsはこんな感じにシンプルに書けるようになった。

var express = require('express')
  , resource = require('express-resource')
  , config = require('config')
  , sequelize = require('dbconn')(config)
  , app = module.exports = express.createServer();

app.resource('users', require('./routes/users'), { id: 'id' });

実際にSequelizeを使ってDBに対するCRUD操作を行うAPIの実装を書く以前に、まだDBすら存在しないのでmysqlコマンドでDBだけ作っておく。

Continue reading »

6月 172012
 

MVCアプリケーションを作る際、コントローラ(C)とビュー(V)は前回紹介したexpress-resourceが面倒を見てくれる。REST APIの場合はビューと呼ぶほどのものではないが、APIの出力形式をXML、JSONと複数対応するにはコンテントネゴシエーションが強力なビュー機能を提供してくれると言える。

さて、今回はモデル(M)に相当する部分を作る際に欠かせないSequelizeを紹介しよう。 Sequelizeを使うと、DBのスキーマやデータを、node.jsアプリケーション内でJavaScriptオブジェクトとして扱えるようになる。いわゆるO/Rマッパーを実現してくれる。MySQL、SQLite、 PostgreSQLと主なオープンソースのRDBMSはサポートされており、RDBMS毎に微妙に異なるSQLの方言などを吸収してくれるので、仮に開発過程でRDBMSを乗り換えることがあったとしても、アプリ側のコードに大掛かりな修正が生じなくて済む。

Continue reading »

6月 102012
 

「node.jsを使って簡単にWebアプリが作れる!」みたいな記事で紹介されているサンプルコードは、だいたいそのまま使いものにならないことが多い。実際のアプリ開発では、いろいろなモジュールをNPMでインストールして、ソースコードツリーの階層なんかにも気を配ったりするものだ。DBへのアクセスも一元化して、O/Rマッパーも使えるようにしたい。国際化対応も考えなければならない。デバッガも必要だ。アプリを作りながら後付していくのもいいが、最初の段階である程度は固めておきたいと思う人も多いだろう。

すべてを一気に紹介すると相当長くなりそうなので、今回はREST APIを作る上で欠かせないexpressとexpress-resourceに焦点を当てる。node.jsとNPMをまだインストールしていなかったらnvmでインストールしておこう。

Continue reading »

5月 282012
 

SenchaのAPIリファレンスサイトであるSencha DocsがExt JS 4を使って実装されているのは知っていて、Ext JS 4をガシガシ使っているところを見ると、Senchaの中で作られたクローズドなフレームワークなんだろうなと思い込んでいた。しかし、つい最近TitaniumのAPIリファレンスを見たら、まったく同じ構成をしていることに驚いて、オープンソースのフレームワークなのか!?と思い、Xenophyの@kotsutsumiさんに訊いたら「JSDuckのことですね。」と教えてくれた。

開発したのはやはりSenchaの中の人なんだが、GitHub上でソースが公開されていた。去年のSenchaCon 2011でもJSDuckのセッションがあって、そこではライブコーディングによるデモが行われている。

Continue reading »