2

次のようなルートを受け取る Node.js / Express アプリが動作しています。

app.get('/resource/:res', someFunction);
app.get('/foo/bar/:id', someOtherFunction);

これは素晴らしく、うまく機能します。

私も Socket.IO を使用しており、一部のサーバー呼び出しで従来の RESTful 呼び出しの代わりに websocket を使用したいと考えています。しかし、私はそれを非常にきれいにして、できればほぼ同じ構文を使用したいと考えています:

app.sio.get('/resource/:res', someFunction);

これにより、Socket.IO への合成 'REST' インターフェイスが提供されます。プログラマーの観点から言えば、プログラマーは別のことをしていません。websockets: trueクライアントからフラグを立てるだけです。

リクエスト動詞を渡して解析するカスタムの方法など、すべての詳細を処理できます。これには問題はありません。私が探している唯一のものは、エクスプレスのようにルートを解析し、それらを適切にルーティングできる関数です。例えば、

// I don't know how to read the ':bar',
'foo/:bar'

// Or handle all complex routings, such as
'foo/:bar/and/:so/on'

私は本当に深く掘り下げて自分でコーディングしようとするか、エクスプレスのソースコードをすべて読んでどこでそれを行っているかを見つけようとすることができますが、それ自体が存在すると確信しています. どこで見つけられるのかわからないだけです。

アップデート

robertklep は、これを完全に解決する素晴らしい答えを提供してくれました。以下の回答に投稿した完全なソリューションにそれを適応させました。

4

2 に答える 2

3

Express ルーター クラスを使用して、面倒な作業を行うことができます。

var io        = require('socket.io').listen(...);
var express   = require('express');
var sioRouter = new express.Router();

sioRouter.get('/foo/:bar', function(socket, params) {
  socket.emit('response', 'hello from /foo/' + params.bar);
});

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

  socket.on('GET', function(url) {
    // see if sioRouter has a route for this url:
    var route = sioRouter.match('GET', url);
    // if so, call its (first) callback (the route handler):
    if (route && route.callbacks.length) {
      route.callbacks[0](socket, route.params);
    }
  });

});

// client-side
var socket = io.connect();
socket.emit('GET', '/foo/helloworld');

明らかに、リクエストで追加のデータを渡し、それをルート ハンドラーにも渡すことができます (たとえば、追加のパラメーターとして)。

于 2013-10-19T20:24:40.943 に答える