巷ではCoffeeScriptが流行っているそうで。ExpressとMongoDb、テストにMochaを使った定型文的なメモ。
インストールはこんな感じで。
$ sudo npm install -g coffee-script $ sudo npm install -g js2coffee $ express sample $ cd sample && npm install $ npm install mocha $ npm install mongoose
expressで出来たテンプレをcoffeeに変換。
$ js2coffee app.js > app.coffee $ js2coffee routes/index.js > app.coffee
Mochaのテスト。全文です。本来はコツコツやっていきませう。
test/routes-test.coffee
routes = require "../routes/index"
mongoose = require "mongoose"
Post = require "../models/Post"
require "should"
describe "routes", ->
req =
params: {}
body: {}
res =
redirect: (route) ->
#do nothing
render: (view, vars)->
#do nothing
before (done) ->
mongoose.connect 'mongodb://localhost/blog', ->
Post.remove done
describe "index", ->
it "should display index with posts", (done) ->
res.render = (view, vars) ->
view.should.equal "index"
vars.title.should.eql "ぶろぐ"
vars.posts.should.eql []
done()
routes.index(req, res)
describe "new post", ->
it "should display the add post page", (done) ->
res.render = (view, vars) ->
view.should.equal "add_post"
vars.title.should.equal "あたらしい投稿"
done()
routes.newPost(req, res)
it "should add a new post when posted to", (done) ->
req.body.post =
title: "たいとるです"
body: "ほんぶんです"
routes.addPost req, redirect:(route) ->
route.should.eql "/"
routes.index req, render: (view, vars) ->
view.should.equal "index"
vars.posts[0].title.should.eql "たいとるです"
vars.posts[0].body.should.eql "ほんぶんです"
done()
メイン
app.coffee
express = require("express")
routes = require("./routes")
mongoose = require('mongoose')
app = module.exports = express.createServer()
app.configure ->
app.set "views", __dirname + "/views"
app.set "view engine", "jade"
app.use express.bodyParser()
app.use express.methodOverride()
app.use app.router
app.use express.static(__dirname + "/public")
app.configure "development", ->
mongoose.connect 'mongodb://localhost/blog-dev'
app.use express.errorHandler(
dumpExceptions: true
showStack: true
)
app.configure "production", ->
mongoose.connect 'mongodb://localhost/blog-prod'
app.use express.errorHandler()
app.get "/", routes.index
app.get "/post/new", routes.newPost
app.post "/post/new", routes.addPost
app.get "/post/:id", routes.viewPost
app.listen 3000
console.log "Express server listening on port %d in %s mode", app.address().port, app.settings.env
ルーティング
routes/index.coffee
Post = require '../models/Post'
module.exports =
index : (req, res) ->
Post.find {}, (err, posts) ->
res.render "index",
title: "ぶろぐ"
posts: posts
newPost : (req, res) ->
res.render "add_post", title:"あたらしい投稿"
addPost : (req, res) ->
new Post(req.body.post).save ->
res.redirect "/"
viewPost: (req, res) ->
Post.findById req.params.id, (err, post) ->
res.render 'post', post: post, title: post.title
モデル
models/Post.coffee
mongoose = require 'mongoose'
Post = new mongoose.Schema(
title: String,
body: String
)
module.exports = mongoose.model 'Post', Post
ビュー
views/layout.jade
!!!5
html
head
title= title
link(rel="stylesheet", href="http://twitter.github.com/bootstrap/1.4.0/bootstrap.min.css")
style(type="text/css")
#content {padding-top: 60px; }
body
.topbar-wrapper
.topbar
.topbar-inner
.container
h3: a(href="/")= title
ul.nav
li: a(href="/post/new") あたらしい投稿
#content.container!=body
views/index.jade
- each post in posts
.page-header
h1
a(href="/post/#{post.id}")= post.title
.content!=post.body
views/add_post.jade
form(method="post", action="/post/new")
fieldset
legend=title
.clearfix
label(for="title") たいとる
.input
input.xlarge#title(type="text", name="post[title]")
.clearfix
label(for="post") ないよう
.input
textarea#post.xxlarge(name="post[body]", rows="3")
.actions
input.btn.primary(type="submit", value="こうかい!")
|
a.btn(href="/") やめた
views/post.jade
.page-header h1= post.title .content!=post.body
実行
$ coffee app.coffee
次はCoffeeKupも使ってみようと思います。Coffeeで統一。


0 件のコメント:
コメントを投稿