Node.jsでつくる
Good Old Web App

2011/11/19 Node.js勉強会 第0回

2012/02/21 追記:このスライドの内容は既に大半がobsoleteです、参考にしないでください。

クラフトギア 渡辺俊輔

Twitter @craftgear

サイト(休眠中)

自己紹介

なぜNode.jsか

100ミリ秒のウェイトが入るHelloWorld

abを使った性能比較

なぜNode.jsか


Good Old Web App

フレームワーク

Expressを選択

テンプレート

Jadeを選択

DBアクセス(MongoDB)

Mongooseを選択

テストフレームワーク

nodeunitを選択

expressoVowsjasmine-nodenodeunitit
非同期のテスト
テストの並列実行××
CoffeeScript対応××
BDDスタイル×

機能テスト

zombieを選択

認証

everyauthを選択

ファイルアップロード

parted or formidableを選択

補助ツール

CoffeeScript

補助ツール - 2

node-supervisor

Nodeインストールからプロジェクト初期化まで

Ubuntuではnaveを使うと簡単

Virtual Environments for Node

npmのインストールは一行

npm
curl http://npmjs.org/install.sh | sh

Expressのインストールとプロジェクト初期化

npm install -g express
express demo_project
cd demo_project
npm ln express jade
node app.js

CoffeeScriptで書き直し

supervisorで監視

NODE_ENV=development supervisor -e 'coffee' app.coffee

Express

Express - 2

.jsファイルとexports

イベントハンドラのマッピング

Jadeを使ってページ表示

Jadeを使ってページ表示 - 2

MongooseでDBアクセス

MongooseでDBアクセス - 2

nodeunitとzombieで機能テスト

nodeunitとzombieで機能テスト - 2

everyauthを使って認証

everyauthを使って認証 - 2

everyauth = require 'everyauth'

everyauth.everymodule
  .handlelogout (req, res)->
    req.session.user = null


everyauth.twitter
  .consumerKey('here is your consumer key')
  .consumerSecret('here is your consumer secret')
  .findOrCreateUser((session, accessToken, accessTokenSecret, twitterUserData)->
    #ここに認証後の処理を書く
    # 引数に渡されるsessionはreq.sessionと同一
  )
  .redirectPath('/')


everyauthを使って認証 - 3

promise = new this.Promise()
#promise.fulfillが呼ばれたときに実行される関数を登録する
promise.callback (doc)->
  #セッションにログイン状態を格納
  session.user.name = twitterUserData.name
  session.user.login = true
# promise.errback
# promise.timeback

#ユーザがすでにデータベースに登録されているかどうかチェックする
Users = mongoose.model('Users')
Users.findOne({twitter_id: twitterUserData.id_str}, (err, doc)->
  if doc
    doc.last_login = Date.now()
  else
    doc = new Users()
    doc.account = 'twitter_' + twitterUserData.screen_name
    doc.name = twitterUserData.name
    doc.twitter_id = twitterUserData.id_str
    doc.last_login = Date.now()
  doc.save()
  #処理が完了したのでpromise.fulfillを呼ぶ
  promise.fulfill(doc)
)

#この場はとりあえずpromiseを返しておく
return promise

everyauthを使って認証 - 4

ファイルアップロード formidable

ファイルアップロード formidable - 2

ファイルアップロード parted

このスライドにかけているもの





ぜひ次回!どうですか?

ありがとうございました

/