2016-07-16 13 views
0

ExpressJSの他のコールとajaxコールを区別することに問題があります。ExpressJSで正しいAccept Content-Typeを判断する方法

私が理解する限り、request.accepts('json')を使用してjsonリクエストを識別できますか?

問題は - 明らかにすべての呼び出しがすべてを受け入れます!

app.get('*', function(request, response, next) { 
    console.log('request accepts:') 

    if(request.accepts('json')){ 
     console.log('--> accepts json') 
    } 
    if(request.accepts('html')){ 
     console.log('--> accepts html') 
    } 
    if(request.accepts('blah')){ 
     console.log('--> accepts blah') // this does not show up 
    } 
    if(request.accepts('application/json')){ 
     console.log('--> accepts json2') 
    } 

    next() 
}) 

私はちょうどページを訪問した場合、それはJSONとHTMLを受け入れます。

$.getJSON(... url ...)を使用しようとすると、jsonとhtmlも認識します。

Headers: 

Browser: "Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" 
Ajax: "Accept application/json, text/javascript, */*; q=0.01" 

私はインクルードは、ヘッダーを受け入れについては専門家ではないんだけど、*/*部分が問題になる可能性があることと思われます。

ExpressJSで正しい(またはおそらく最初の)受け入れタイプを判断するにはどうすればよいですか? または、JSONリクエストを通常のページビューから区別するにはどうすればよいですか?

+0

最初にこれを行う必要があるのはなぜだろうか。同じURLから異なるデータ型を提供する必要がある場合、ほとんどのAPIは '/ path/to/server?format = json'のようなクエリのパラメータを使用します。 – charlietfl

+0

@charlietflこれは主にパスに依存しないミドルウェアがあるためです私はjsonベースの呼び出し中に無効にしたいと思います)。後でパスのルーティングが起きているように見えるので、あまりにも遅いので、フラグを設定することはできません。 2つのオプションがあります:ルーティングをシミュレートするミドルウェアを作成し、特定のパスが呼び出されたかどうかを確認する(meh!)か、単に受け入れたタイプをチェックします。 – Katai

+0

jsonにしかサービスしていないREST APIを持っていると仮定すると、ルートに ''/api/"'のようなapiのメインパスが含まれているかどうかを確認できません。一般的に奇妙な問題だと思われる – charlietfl

答えて

0

ブラウザで行われたほとんどすべてのGETリクエストは*/*で終了しています。これはほとんどすべてを受け入れることを意味します。決定を下すには、配列req.acceptedをチェックすることができます。それは次のようになります。

これにより
[ { value: 'application/json', 
    quality: 1, 
    type: 'application', 
    subtype: 'json' }, 
{ value: 'text/html', 
    quality: 0.5, 
    type: 'text', 
    subtype: 'html' } ] 

、JSONが存在する場合、それは特別な要求で、それ以外の場合は私がのために配列を使用することにより、動作するように思われる解決策を見つけた単純な要求

-1

ですaccepts()

if(request.accepts([ 'json', 'html' ]) == 'json') { 
    // do something 
} else { 
    // do something else 
} 
関連する問題