2013-09-04 9 views
12

オプションGETパラメータ

app.get('/foo/start/:start/end/:end', blah.someFunc); 

試合

/foo/start/1/end/4 

が、私は、それはまた、私はこれを試してみた

/foo/start/1/end/4/optional/7 

オプションのパラメータと一致するようにしたいです:

app.get('/foo/start/:start/end/:end(/optional/:value)?', blah.someFunc); 

ですが、上記の2つの例のいずれとも一致しません。私はそれが何か他のことを期待しているときにRegExpを与えようとしているからだと思いますか?

ありがとうございました。

+0

パスは、実行中のRegExpsと混在させることはできません。 パスまたはRegExpのみを使用します。 http://expressjs.com/api.html#app.VERB – tim

答えて

19

は、なぜあなたはそれがオプション価値のないものの前に使用されます。この

app.get('/foo/start/:start/end/:end/optional/:value', blah.someFunc); 
app.get('/foo/start/:start/end/:end', blah.someFunc); 

のように、あなたが持っている1の前に別のルールを追加しないでください。

あなたはこれを試すだけの1行を使用する場合:

app.get('/foo/start/:start/end/:end/optional?', blah.someFunc) 

は、例えばthe docsを参照してください。

+2

ええ、私はできますが、1つのルール(可能であれば)を持つ方がクリーンであると思いました:) – ale

+0

私はそのオプションを追加するために私の答えを編集しました。 –

+1

パフォーマンスキラー... Regexpがより効率的になる可能性があります。 – CuSS

5

ルート内に正規表現を使用することもできます。おそらく、何かのように:

app.get(/^\/foo\/start\/:start\/end\/:end(\/optional\/:value)?/, function (req, res, next) { 
+4

これは汚いです:) ^^ –

+10

なぜですか? Expressはすべての*ルート文字列を正規表現に変換します。 regexesを直接使用することは、ドキュメント全体で参照されています。http://expressjs.com/4x/api.html#request – MateodelNorte

+1

私はそれが気難しいことを知っています。 –

15

あなたはエクスプレス4.xを使用している場合は、それから私は、その優れたルートの配列フォーマットを使用すると思います。 例えば、/serviceというIDを持つidと一緒に使用された場合、すべてのサービスリストと同じルートを提供するルートを持っています。/service/id/:idは、idで単一サービスを提供します。

app.get(['/service', '/service/id/:id'], function(req, res) {}); 
+0

きれいな答え、質問のみが「/サービス」を2回書くのを避けることができますか?正規表現を必要とする – orepor

+0

はきれいです。 –

6

この例では、URLが/ helloまたは/ hello/worldの場合、この例では動作します。 ?パラメータをオプションにする(表現4)。

// app.js 
var index = require('/routes/index'); 
app.use('/hello', index); 

// routes/index.js 
router.get('hello/:name?', function(req, res){ 
    var name = req.params.name; 
    var data = { 
    name: name 
    }; 
    res.json(data); 
});