8

実際のルーティングが行われる前に、特定のパラメーターが設定され、小さなコードを実行する場合に備えて、エクスプレスを使用してクエリ文字列を解析しようとしています。ユースケースは、使用されているリンクに関係なく、設定できる特定の値を取得することです。私はエクスプレス機能を使用して、next() を使用して次の可能なルールに物を渡します。

これまでのところ、私は試しました-すべての app.get/post-rule-block の一番上で:

app.get('[?&]something=([^&#]*)', function(req, res, next) {
  var somethingID = req.params.something;
  // Below line is just there to illustrate that it's working. Actual code will do something real, of course.
  console.log("Something: "+somethingID);
  next();
})

app.get('/', site.index);

また:

app.param('something', function(req, res, next) {
  var somethingID = req.params.something;
  console.log("Something: "+somethingID);
  next();
})

app.get('/', site.index);

トリガーする対象の例:

URL: www.example.com/?something=10239
URL: www.example.com/superpage/?something=10239
URL: www.example.com/minisite/?anything=10&something=10239

残念ながら、私の解決策はどれも実際には機能せず、次の一致ルールがトリガーされるだけで、上記の小さな関数は実行されません。これをどのように行うことができるか、誰にも考えがありますか?

編集:私は、後で他のルーティングルール内で上記のパラメーターを使用していないため、param-example が機能していなかったことを理解しており、そのときにのみトリガーされます。

また、Express がクエリ文字列を無視し、通常はルーティングが既に行われた後に関数内で解析されることをロジックが暗示していることも理解しています。しかし、前述のように、これは「ルートに依存しない」必要があり、このアプリケーション内で処理される任意の URL で動作する必要があります。

4

2 に答える 2

23

expressクエリ文字列に基づいてルーティングすることはできません。関連するパラメーターが存在する場合、何らかの操作を実行するミドルウェアを追加できます。

app.use(function (req, res, next) {
    if (req.query.something) {
        // Do something; call next() when done.
    } else {
        next();
    }
});

app.get('/someroute', function (req, res, next) {
    // Assume your query params have been processed
});
于 2013-02-16T11:48:40.567 に答える
2

わかりました、ここにはかなりの論理的な欠陥があります。ルーティングでは URL のみが使用され、クエリ文字列は無視されます。

(またはより良い「A」)ソリューションは、実際には次のとおりです。

app.get('*', function(req, res, next) {
  if (req.query.something) {
    console.log("Something: "+req.query.something);
  };
  next();
})

説明: Express はルーティングのクエリ文字列を無視しているため、すべての URL に一致する唯一の正規表現は "*" です。それがトリガーされたら、前述のクエリ文字列が存在するかどうかを確認し、ロジックを実行して、「next()」を使用して次のルールに一致するルーティングを続行できます。

そしてはい:facepalm

于 2013-02-16T11:47:46.257 に答える