6

ExpressJS と Socket.IO について理解しようとしています。app.js からインクルードする別のファイルにルートがあります。

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');

ただし、ルートの 1 つからイベントを発行しようとすると、socket.io への参照がありません。

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

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

ルート = 必須 ("ルート/myRoutes")(io);

4

5 に答える 5

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.exportsします。require(適切に行わないと、循環依存の問題が発生する可能性があります)

オブジェクトを渡すのioがおそらく最もクリーンな方法ですが、オプションがあります。

于 2012-12-31T15:00:06.283 に答える
2

socket.io はルートでは機能せず、ソケットで機能します。

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

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 ドキュメントのみをレンダリングします。

<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 はサーバーへのソケットを開き、追加のデータを受け取ります。

ここで他の例を参照してください。

免責事項: コードはゼロから作成され、テストされていません。

于 2012-09-24T16:47:13.397 に答える
0

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

外部ルート ファイルに「次の」オブジェクトを配置します。

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

メイン ファイルでは、io.on('connection') 内に最後のルート ホップを記述します。

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' });
    });

});
于 2015-08-19T15:53:17.867 に答える