gotin blog

Whatever gotin wanna write

node.jsでwsでWebSocketしてるサーバとiOSアプリをつなぐものを作っているんだけど、node.jsのホスティングサービスでこれらをうまくつなげられる環境が今のところみつからない

今まで試したもの

ホスティングサービス

  • heroku
  • dotcloud

node.jsのWebSocketライブラリ

  • socket.io
  • ws

iOS用のWebSocketライブラリ

  • SocketRocket

 

他にも試した気がしたけど忘れしまった。。(なのでこれはこれ以上忘れないためのメモ)

いろいろ試してローカルでは動くんだけど、ホスティングサービスの上ではインストールできなかったり動かなかったりした。PaaS系はやっぱり好きな環境にしきれなくて歯がゆい。EC2使っとけばいいかな。

 

そういえばGreasemonkeyだとドメイン関係なくwebsocketできるのかな?
 

nvmでnode v0.6.6をインストール

% nvm install v0.6.6

でMac Book Air / Lion にインストールを試みた。
何度もlibv8のインストール(?)のあたりでつまづいた。
いろいろ調べたら、bashじゃないとダメよ的なことだったようで、
bashに切り替えて再度インストールしてみたらあっけなく成功した。

追求する気はないけど、なんで今時実行時のsh環境に左右されるようなインストール環境になっちゃってるんだろう?

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エスケープされずに出力されるみたい。

動かす

% node server.js

動いた。
f:id:gotin:20110417013524p:image

よくよくみたら

% railway generate scaffold Hogehoge

もできるようになってた。それでgenerateされるコードを見たほうが何ができるのかよくわかる。
でも結構自分で埋めないとダメなところも多い。