<?php usleep(100000); echo "Hello World"; ?>
var http = require('http')
server = http.createServer()
server.on('request', function(req, res){
setTimeout(function(){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello World');
res.end()
}, 100)
})
server.listen(3000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:3000/');
ab -n 100 -c 1 http://localhost/
| 一秒あたりのリクエスト処理回数 | |
|---|---|
| PHP | 9.824 回 |
| Node.js | 9.886 回 |
ab -n 100 -c 100 http://localhost/
| 一秒あたりのリクエスト処理回数 | |
|---|---|
| PHP | 61.348 回 |
| Node.js | 828.198 回 |
| expresso | Vows | jasmine-node | nodeunitit | |
|---|---|---|---|---|
| 非同期のテスト | ○ | ○ | △ | △ |
| テストの並列実行 | ○ | ○ | × | × |
| CoffeeScript対応 | × | ○ | × | ○ |
| BDDスタイル | △ | ○ | ○ | × |
npm install -g coffee-script
func = (arg)->
{
func: (arg)->
}
Ubuntuではnaveを使うと簡単
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
app.get('/', (res, req)->
res.end('hello!')
)
#app.post, app.all, app.put, app.del
(req, res, next)-> next()
foo = (req, res, next)-> next()
bar = (req, res, next)-> next()
app.get("/", foo, bar, (req, res)->
res.end("foo->bar->this")
)
app.use(bodyParser())
exports.index = (req, res)-> exports.list = (req, res)->
module.exports = {
index: (req, res)->
list: (req, res)->
}
app = module.parent.exports
exports.index = (req, res)->
a_value_from_app = app.set('this value was set in app.js')
Top = require './handlers/top'
routes = [
{method: "GET", path: "/", handler: Top.index}
]
for route in routes
preHandlers = []
postHandlers = []
if route.login
preHandlers.push isLogin
switch route.method
when "ALL"
app.all route.path, beforeFilters, preHandlers, route.handler, postHandlers
when "GET"
app.get route.path, beforeFilters, preHandlers, route.handler, postHandlers
when "POST"
app.post route.path, beforeFilters, preHandlers, route.handler, postHandlers
res.local('foo', '<strong>フー</strong>')
res.locals({bar: 'バー', foobar: 'フーバー'})
res.render('index', {bazz: '<strong>バズ</strong>'})
div= foo
div bar is #{bar}
div!= foo
div bazz is !{bazz}
#スキーマの定義
mongoose = require 'mongoose'
mongoose.connect 'mongodb://localhost/' + 'demo_' + process.env.NODE_ENV
Schema = mongoose.Schema
User = new Schema
name: String
mail: String
pass: String
mongoose.model('users', User)
#dbにアクセス
Users = mongoose.model 'users'
Users.findOne( {}, (err, doc)->
console.log err, doc
)
user = new User()
user.name = req.body.name
user.save( (err)->
console.log err
)
#validatorが一つだけの時
v1 = (v)->
return false
User = Schema
name: {type:String, validate:[v1, 'v1 check error!']}
#validatorが複数の時
v1 = (v)->
return false
v2 = (v)->
return false
User = Schema
name: String
User.path('name')
.validate(v1)
.validate(v2)
zombie = require 'zombie'
b = new zombie.Browser()
module.exports =
'トップページが表示できること': (test)->
b.visit('/', (err, b, status)->
test.equal status, 200
test.done()
)
if process.env.NODE_ENV == 'development'
exec = require('child_process').exec
testcase_dir = 'tests/functional/'
fs = require 'fs'
fs.readdir testcase_dir, (err, files)->
files.sort()
for file in files
if file.match(/[.coffee]$/) != null
child = exec "nodeunit #{testcase_dir}"+file, (error,stdout,stderr)->
console.log stdout
console.log '実行エラー', stderr if stderr
console.log 'エラー', error + "\n" if error
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('/')
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
auth:
{ twitter:
{ token: '6HDpnelKohWcu06rgOH5RZXxyelxi6r7QG1RTmsbg',
tokenSecret: '9LtvyI7Zz4C4YAjCkO6709lHM0RM2GAJxJuTwp8',
verifier: 'hgjDvEwVGPuC2X5sLHrom2V9BF2Dm0z2x1ZowGNqglI',
user: [Object],
accessToken: '33924176-puSJLoUlZF1qatOEzbhfV5IwQhw9JAPHcHNU4SzgE',
accessTokenSecret: 'IInkL7SK882yUrN5cSDNFYGUCbuhwxT3kketDya9DY' },
loggedIn: true,
userId: '4eb77a41adfb08411c000096' },
app.set 'view engine', 'jade'
app.use (req, res, next)->
contenttype = req.headers['content-type']
if contenttype? && contenttype.match /multipart/form-data/
form = new formidable.IncomingForm()
form.uploadDir = __dirname + '/temp'
multiple_files = []
form
.on 'fileBegin', (name, file)->
console.log "start receiving file #{name}"
.on 'progress', (received, total)->
console.log received + ' of ' + total + ' bytes are received'
.on 'file', (name, file)->
multiple_files[name] = [] unless multiple_files[name]?
multiple_files[name].push file
console.log "#{name} is received."
form.parse req, (err, fields, files)->
req.body = fields
for field_name, file of multiple_files
req.body[field_name] = file
next()
else
next()
app.use bodyParser()
[ { size: 19396,
path: '/tmp/cd962a67781efc86d8e49c0c842bcd65',
name: 'cat01.jpg',
type: 'image/jpeg',
lastModifiedDate: Mon, 07 Nov 2011 05:58:16 GMT,
_writeStream:
{ path: '/tmp/cd962a67781efc86d8e49c0c842bcd65',
fd: 9,
writable: false,
flags: 'w',
encoding: 'binary',
mode: 438,
busy: false,
_queue: [],
drainable: true },
length: [Getter],
filename: [Getter],
mime: [Getter] } ]
app.use parted({path: __dirname + '/temp', multiple: true})
[ '/home/shun/projects/pixelo/temp/range_rove.1320645607273.jpg', '/home/shun/projects/pixelo/temp/range_rove.1320645607346.jpg', '/home/shun/projects/pixelo/temp/range_rove.1320645607359.jpg' ]
/