2012-09-24 14 views
6

私はExpressJSとSocket.IOを頭に入れようとしています。私が試してみて、私はsocket.ioへの参照を持っていない私のルートの1つからイベントを発するしかしRoute Separationを使用したExpressJS - Socket.IO

var express = require('express')  
    , db = require('./db') 
    , mongoose = require('mongoose') 
    , models = require('./models/device') 
    , http = require('http') 
    , path = require('path') 
    , app = express() 
    , server = http.createServer(app) 
    , io = require('socket.io').listen(server) 
    , routes = require('./routes/myRoutes'); 

:私は私のapp.jsから含まれ、別のファイルに私のルートを持っています。

exports.update = function(req, res){ 
    return Item.findById(req.params.id, function(err, item) { 
     // Do some checks and save. 
     socket.emit('updated'); 
    } 
} 

私はこれが利用できない理由を理解しています。むしろ、socket.ioのハンドルを取得する最も良い方法は、app.js以外の別のファイルからのものであるかどうかはわかりません。私はthis question(リカルドの答えを参照)を見ていましたが、私はまだ明確ではありません。理想的には、これを避けたいと思います:

routes = requires( "routes/myRoutes")(io);

+0

httpモジュールの使用を避けることができますが、socket.ioには、express依存関係(3.xx)から呼び出せるhttpサーバが必要です。var app = express()、server = app.listen(3000)、io = socket.listen(サーバー); –

+0

更新:feathers.jsを見て – backdesk

答えて

5

チェックアウトexpress.io

それはリアルタイム要求のルーティングを持っており、他の便利な機能の束。

app = require('express.io')() 
app.http().io() 

app.io.route('example', function(req) { 
    // do something interesting 
})) 

app.listen(7076) 

ioオブジェクトを渡す必要があります。いくつかの選択肢がありますが、それはあなたが誰に尋ねるかによって「ベスト」かもしれません。

  • ioまたはappをグローバルにします。 (一部の人がグローバルでフリークアウトする)
  • module.exportsrequireを別のファイルのオブジェクトに使用します。

ioオブジェクトを渡すのが最も簡単な方法ですが、オプションがあります。

+1

デッドリンク。控えめな? – Keith

+0

express.io link dead、express-io.orgにリダイレクトしています –

2

socket.ioはルートでは動作しません。ソケットで動作します。含む、

io.sockets.on('connection', function (socket) { 
    socket.on('update', function (your_id) { 
    Item.findById(your_id, function(err, item) { 
     socket.emit('send_update', item); 
    } 
    }); 
}); 

あなたの更新のルートだけJavaScriptが含まれるHTML文書をレンダリングする:

あなたはapp.jsに含まapp.jsするには、このコードまたは別のファイルを追加し

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost'); 
    socket.emit('update', { your_id: '1' }); 
    socket.on('send_update', function (data) { 
    console.log(data); 
    }); 
</script> 

ページがレンダリングされて完成すると、client-javascriptはサーバーへのソケットを開き、追加のデータを受け取ります。

more examples here.

免責事項を参照してください:コードをスクラッチから書かれ、テストされていません。

+0

を理解してください。私の明示的なアプリは安らかなAPIとしてしか機能しないので、デフォルト以外の視野ではあまり進んでいません。レコードが変更されたときにイベントを出したいと思っていました。サーバーから通知(一度保存した後)またはクライアントを通知する必要があるかどうかは不明でした。 – backdesk

+0

エクスプレスと。[jQuery](http://api.jquery.com/change/)/ [ajax](http://api.jquery.com/jQuery.post)の.post-routeを使ってこれを行うことができます/)溶液を得た。 socket.ioよりも良いかもしれません。 – Patrick

2

最良の方法はクロージャを使用することです。例:

exports.update = function(socket){ 
    return function(req, res) { 
    //In here now you can have the reference to the socket io 
    Item.findById(req.params.id, function(err, item) { 
     // Do some checks and save. 
     socket.emit('updated'); 
    } 
    } 
} 

そして:

app.post('/your_path', update(io)); 
9

さてあなたは本当にそのためexpress.io必要はありません。最も簡単な解決策は、新しいモジュールをエクスポートし、socket.ioインスタンスへの参照を渡すことです。 あなたのアプリで。JSあなたが持っている:

var express = require('express'), 
    ... 
    , server = http.createServer(app) 
    , io = require('socket.io').listen(server) 
    , routes = require('./routes/myRoutes'); 

は今、新しいモジュールを必要とし、それをsocketio参照を渡します。そうするための(app.jsで)この新しい行を追加します。

require('./app/path/to/your/socketio/controller/socketio')(io); 

はその後socketio.jsファイルに最後に

socketio.jsと呼ばれるあなたのpath/to/your/socketio/controllerに新しいファイルを作成し、あなたの新しいモジュールをエクスポートします:

module.exports = function(io) { 

    io.sockets.on('connection', function (socket) { 

     socket.on('captain', function(data) { 

      console.log(data); 

      socket.emit('america'); 
     }); 
    }); 
}; 

あなたが行く!

+0

ありがとうございます。あなたは急行を必要としないことについてさらに詳しく説明できますか?純粋なソケットベースのソリューションを実装する方法については、しばらく考えてきました。 – backdesk

+2

この "sockets.js"モジュール戦略はGithubでかなり人気がありますが、私の人生の間、ルートファイル(例:ルート/マイルート)が後でそのモジュール(sockets.js)にどのようにアクセスするかを理解できません。 :( –

0

私はExpressjsのミドルウェアルータを使用しました(私は4.xを使用しています)。

module.exports = function(app, settings){ 
    app.post('/something', function(req, res, next) { 
    ... 
    next(); 
    } 
}; 

そして、私はio.on(「接続」)内の最後のルートのホップを書くメインファイル内:

io.on('connection', function (socket) { 

    // Final route for middlewares who need to interact with socket.io 
    app.post('/something', function (req, res, next) { 
     socket.emit('event', { result: 'ok' }); 
    }); 

}); 
私は「次の」オブジェクトを置く外部ルートファイルで

関連する問題