テスト
ん?どうなるんだ?
あぁこういうことか。
テスト。
雪だるま作ってみた。
花並べてみた。
node.jsでwsでWebSocketしてるサーバとiOSアプリをつなぐものを作っているんだけど、node.jsのホスティングサービスでこれらをうまくつなげられる環境が今のところみつからない
今まで試したもの
ホスティングサービス
- heroku
- dotcloud
node.jsのWebSocketライブラリ
- socket.io
- ws
iOS用のWebSocketライブラリ
- SocketRocket
他にも試した気がしたけど忘れしまった。。(なのでこれはこれ以上忘れないためのメモ)
いろいろ試してローカルでは動くんだけど、ホスティングサービスの上ではインストールできなかったり動かなかったりした。PaaS系はやっぱり好きな環境にしきれなくて歯がゆい。EC2使っとけばいいかな。
そういえばGreasemonkeyだとドメイン関係なくwebsocketできるのかな?
Hatena Blog使ってみたいです
しばらくほったらかしになってましたが、気付けば新しくHatena BlogがBetaスタートしたんですね。どなたか招待してもらえると嬉しいです。
express-on-railwayをほんの少しだけ試した
node.jsをいじりはじめないといけないなと思い、ようやく触り始めた。いろいろフレームワークも作られてるようでとりあえずひとつ、express-on-railwayをいじってみた。フレームワークの上にフレームワークを作ってるみたいだけども。
https://github.com/1602/express-on-railway
とりあえず動かすには
- mongodb
- node.js
- npm
をインストールして、
npmで
- express
- mongodb
- connect-mongodb
- mongoose
をインストール。
で、
$ git clone git://github.com/1602/express-on-railway.git $ cd express-on-railway $ npm install
アプリケーションをつくる
% railway init sample
express2.2.2で動くように修正
現時点で僕の環境ではexpress2.2.2がインストールされていたのだけど、express-on-railwayで想定しているexpressのバージョンは1.0.0のようで、2.2.2だとうまく動かなかった。server.jsのapp.configureのあたりを少し修正するとうごいた。
app.configure(function(){ // app.use(express.staticProvider(__dirname + '/public')); app.use(express.static(__dirname + '/public')); // Providerはいらない app.set('views', __dirname + '/app/views'); app.set('view engine', 'ejs'); // app.use(express.bodyDecoder()); app.use(express.bodyParser()); // DecoderじゃなくてParser // app.use(express.cookieDecoder()); app.use(express.cookieParser()); // DecoderじゃなくてParser // app.use(express.session({store: mongoSessionStore})); app.use(express.session({secret:"sample", store: mongoSessionStore})); // secret属性を追加 app.use(express.methodOverride()); app.use(app.router); });
モデル
デフォルトだとconnect-mongodbをドライバとして、mongooseをORマッパ風の便利ライブラリとしてmongoDBを使うみたい。mongoDBは使ったことがないし、モデルの定義はどう書くんだろうと思ったけど、
% railway generate model Comment title:String body:String date:Date
とかすると、db/schema.js に
/** * Comment */ var CommentSchema = new Schema; CommentSchema.add({ body: { type: String }, title: { type: String }, date: { type: Date } }); mongoose.model("Comment", CommentSchema); module.exports["Comment"] = mongoose.model("Comment");
ってのが追記されて、それだけでとりあえずcontroller内のコードとかrailwayコンソール(% railway cでコンソールが使える)でCommentモデルが使えるようになってた。
コントローラ
% railway generate controller sample home post
とすると、/app/controllers/sample_controller.jsができて中身が
action("home", function(){ }); action("post", function(){ });
となっている。
action("home", function(){ Comment.find({}, function(err, comments){ render({comment: new Comment(), title:"test!", comments:comments}); }); }); action("post", function(){ var comment_body = req.body.comment; var comment = new Comment(); comment.body = comment_body; comment.save(function(err){ redirect('/'); }); });
こんな感じでコントローラ内でやりたいことを適当に書く。
ルーティング定義
exports.routes = function (map) { map.get('/', 'sample#home'); map.post('/post', 'sample#post'); };
とりあえずこんな感じ。
ビュー
/app/views/sample/home.ejs がすでにできてるので適当に埋める。
<h1><%= title %></h1> <ul> <% comments.forEach(function(comment){ %> <li><%= comment.body %></li> <% }); %> </ul> <% form_for(comment, {action:'/post'}, function(f){ %> <%- f.input('comment') %> <%- f.submit('comment') %> <% }); %>
<%= xxx %>
とかくとhtmlエスケープされて出力
<%- xxx %>
と書くとhtmlエスケープされずに出力されるみたい。