2012年2月1日水曜日

no.de で npm がおかしかった件と、heroku で WebSocket(xhr-polling)

node.js のPaaS(だっけ?)で有名な no.de ってところがあるんですが、
そこで、package.json とかに npm で入れて欲しいやつを

    "dependencies" : {
        "socket.io"       : "0.8.7",
        "xmlhttprequest"  : "1.3.0"
    }

とか書いて(勿論これだけじゃダメだけど)も、
node.js のバージョンが0.4.12じゃnpm が動かねーよバーカってエラーが出るんだけど、
node -v
やると、node.js のバージョンが 0.6.8て出てきて、困ってた。

http://discuss.joyent.com/viewtopic.php?id=31932

ここでFixするやりかたがやっと出てきたので書いておきます。
Windowsだと、cmd.exe を開いて


ssh admin@your-machine.no.de
ってやってrootで入って 
 
sudo bash
vi /opt/nodejs/service-starter

service-starter をvi で開いて、
 
20行目の
NODE=/opt/nodejs/v0.4/bin/node
NODE=/home/node/local/nodejs/bin/node
に書き直して保存して、 
 
一回 ssh からログアウトして、
 
ssh your-machine.no.de
今度は普通のユーザでログインして 
node-service-deploy

ってやればいいみたいです。
 
あ、ssh の公開鍵とかあれこれやってからね。
 
このエラーのおかげで、昨日は色々困ってた。
困ったついでに、heroku でSocket.io でWebSocketもどきを動かすやり方を覚えた。
WebSocketもどきと書いたのは、
heroku ではまだWebSocketが使えない(今後使えるようになるかも知らん)ので、
xhr-polling でやるしかない。

サーバ側のJS
var io = require('socket.io').listen(3000);
 io.set("transports",["xhr-polling"]); //※ここ
 io.set("polling duration",10); //※ここ
 io.sockets.on('connection', function (socket) {
  socket.on('message', function (data){
   try{
    data = JSON.parse(data);
    socket.send("オウム返し" + data.messagebody);
   }catch(e){console.log(e);}
  });
 });

クライアント側のJS
<script type='text/javascript' src='socket.io.js'></script>
<script type='text/javascript'> 
var socket = io.connect("http://hoge.herokuapp.com:3000/");
socket.on('message',function(data){ // なんかメッセージ貰ったとき
 try{
  var json = eval("(" + data + ")");
  if(!json || json == null || typeof(json) == "undfined"){
   return;
  }
  socket.send(json.messagebody);
 }catch(e){
 }
});
socket.on('connect', function () {
 data = {messagebody : "ちんちんもげろ"};
 data = JSON.stringify(data); //接続できたとき
 socket.send(data);
});
</script>
こんなんでいいみたいです。

クライアントが使う socket.io.js がどこにあるのかわからなかったから、socket.io 使わなかったけど、
 
https://github.com/LearnBoost/socket.io-client
 
ここにあるやつダウンロードして、
dist ていうディレクトリの中に
socket.io.js か、 socket.io.min.js のどっちかをコピーして使えばいいみたいですよ。
勉強になりましたねー。うほうほ。

xhr-polling 使ってみたけど、
とりあえずコンソールがエライことになるというか、
接続しては切断してまた接続しては切断するので、
やっぱ WebSocket 普通に使えたほうがいいなーという感じです。
あわただしそうで、大変そうだもの。サーバが。

0 件のコメント:

コメントを投稿