0

Express 用のアセット処理フレームワークを構築しています。

アプリケーション全体を再起動せずに、変更されたファイルを自動再読み込みします。どのファイルがどのバインディングを作成したか ( などapp.get('/asdf')) を認識し、そのファイルが変更されると、ルートのバインドを解除し、変更されたファイルで再バインドします。

次のような Express ルーター ファイルがあるとします。

app.get('/my_route', method);

変更したら、~~~~~のようなものを実行する必要があります

 // pseudo code -- I need something like this
 app.unbind('get', '/my_route', method);

~~~~~

リロードする前に。では、方法はありunbindますか?

ルート オブジェクトを手動で編集する必要がありますか?

これがわかれば、ルーター ファイルを変更して、古いリスナーのバインドを解除し、新しいリスナーを追加し直すことができます。私はsocket.io に対して同様のことをしましたが、エクスプレスでバインドを解除する方法を見つける必要があります

ありがとう!

4

2 に答える 2

2

ルート パス自体は変更されないと想定しています。

最終的に変更されるのは、前述のルートに関連付けられている「メソッド」であるため、メソッド定義を抽象化して、変更されたファイルを「リロード」することでメソッド定義を変更できるようにすることができれば、実際に変更する必要はありません。ルートを「アンバインド」します。

たぶん中間関数?

ちょうど私の $0.02

乾杯

于 2013-11-06T17:04:47.513 に答える
1

ルートをループしapp.routesて削除するか、コールバックを直接変更できます。ルート オブジェクトは次のようになります。

{ get: 
   [ { path: '/',
       method: 'get',
       callbacks: [Object],
       keys: [],
       regexp: /^\/\/?$/i },
   { path: '/user/:id',
       method: 'get',
       callbacks: [Object],
       keys: [{ name: 'id', optional: false }],
       regexp: /^\/user\/(?:([^\/]+?))\/?$/i } ]

したがって、次のようなものを作成できます。

function unbind(method, path) {
  var routes = app.routes[method];
  for (var i = 0; i < routes.length; i++)
    if (routes[i].path == path)
      routes.splice(i, 1);
};

元のルート ハンドラーは にapp.routes.method[i].callbacksあり、配列を返します。

于 2013-11-06T17:39:42.437 に答える