2016-06-24 5 views
1
app.get('/api/advancedSearch/:id/:page_no/:exact_phrase?/:exclude_words?' 
,function (req,res) 
{ //body }); 

でapp.get表現し、私はフィールドの最初のカップルに問題を持っていない、問題は「exact_phrase」で発生し、「単語を除外します"フィールド。これらはリストであると考えられています。もし両方が渡されれば、私は問題を起こさないでしょう。は、私は上記のようにapp.getを作成しようとしている複数のフィールド

問題の原因は、これらのフィールドの一方または両方が存在しない場合があり、それでも取得する必要がある場合があるということです。私はそのためにapp.getを設計することができないようです。

app.getを設計する方法はありますか、これを行うことができるようにリクエストを送信しますか?

+3

'req.params'の代わりに[' req.query'](http://expressjs.com/en/4x/api.html#req.query)を使う方が良いようです。 – cdbajorin

答えて

3

一般に、URLの任意の部分は、URL位置によって識別されるのではなく名前付きパラメータであるため、どの文字列が存在するのかを自己識別するため、クエリ文字列の方がずっとうまく機能します。

ExpressルートマッチングのURLパスセグメントは特定の順序であり、渡されたものに対して決定的ではないため、オプションのパラメータが必要なシーケンスは使用できません。エクスプレス・ルート・マッチング・アルゴリズム自体は、あなたが望むほど柔軟ではなく、パワフルではありません。

あなたは、いくつかのオプションがあります。

  1. はルート定義のうち:exact_phrase:exclude_wordsを残し、その後、ちょうどあなた自身のURLがあります正確に何を見るためにルートハンドラで解析します。この方法で、任意のフォーマットに調整することができます。

  2. URL内のパスセグメントではなく、異なる順序またはオプションのクエリパラメータとしてすべてのパラメータを入れてから、req.queryを使用してURLに存在するものを正確に表示します。クエリパラメータは任意で、任意の順序で指定できます。

この最後のオプションは次のようになります:

FYI
// url: /api/advancedSearch/123/4?exact_phrase=foo&exclude_words=cat,dog 
app.get('/api/advancedSearch/:id/:page_no/', function(req,res) { 
    var excludeWords = []; 
    if (req.query.exclude_words) { 
     excludeWords = req.query.exclude_words.split(","); 
    } 
    var exactPhrase = req.query.exact_phrase || ""; 

    // do the rest of your processing here 

}); 

、それはオプションの引数がのqueryStringではなく、コアのURLパスでなければならないことを概念的に理にかなっています。クエリ文字列パラメータは自己識別であるため、存在するものと存在しないものとのあいまいさが大幅に少なくなります。 URLにオプションのパスセグメントがある場合は、どのパスセグメントが存在し、どのような意味があるのか​​を特定するための何らかのシステムを発明する必要があります。これは完全なアプリケーションとコンテキスト固有のものなので、Expressはそれを自動的に行うことはできません。

+0

正確にありがとうございました! –

関連する問題