19

ルートが人間と機械の両方のニーズを満たすようにしたいので、クライアントから要求されたタイプが JSON か HTML かを確認したいと思います。

次の場所にある Express 3 のドキュメントを読みました。

http://expressjs.com/api.html

そして、次のように使用されるreq.accepts()との2 つのメソッドがあります。req.is()

req.accepts('json') 

また

req.accepts('html') 

これらは正常に機能していないため、次を使用してみました。

var requestType = req.get('content-type');

また

var requestType = req.get('Content-Type');

requestTypeは常にundefined...

このスレッドの提案を使用する:

.is() を使用した Express.js チェック リクエスト タイプが機能しない

どちらも機能しません。私は何を間違っていますか?


編集 1 : クライアントの HTML ネゴシエーションが正しいことを確認しました。これが私の2つの異なるリクエストヘッダーです(デバッガーインスペクターから取得):

HTML :Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

JSON :Accept: application/json, text/javascript, */*; q=0.01


解決策(Bretに感謝):

Acceptヘッダーを間違って指定していたことが判明し、それ*/*が問題でした。これが機能するコードです!

//server (now works)
var acceptsHTML = req.accepts('html');
var acceptsJSON = req.accepts('json');

if(acceptsHTML)  //will be null if the client does not accept html
{}

私は JSTREE を使用しています。これは、下で jQuery Ajax 呼び出しを使用する jQuery プラグインです)。Ajax 呼び出しに渡されるパラメーターは「ajax」フィールドにあり、「accepts」パラメーターを完全な「headers」オブジェクトに置き換えました。現在は動作しており、プレーンな jQuery を使用しているときに問題が発生した場合は、問題を解決する必要があります。

//client 

.jstree({
            // List of active plugins
            "plugins" : [
                "themes","json_data","ui","crrm","cookies","dnd","search","types","hotkeys","contextmenu"
            ],

            "json_data" : {
                "ajax" : {
                    // the URL to fetch the data
                    "url" : function(n) {
                        var url = n.attr ? IDMapper.convertIdToPath(n.attr("id")) : "<%= locals.request.protocol + "://" + locals.request.get('host') + locals.request.url %>";
                        return url;
                    },
                    headers : {
                        Accept : "application/json; charset=utf-8",
                        "Content-Type": "application/json; charset=utf-8"
                    }
                }
            }
        })
4

4 に答える 4

3

「本来の動作をしていない」と定義してください。

言い換えると:

// server.js
console.log('Accepts JSON?', req.accepts('json') !== undefined);

// client sends 'Accept: application/json ...', result is:
Accepts JSON? true

// client sends 'Accept: something/else', result is:
Accepts JSON? false

クライアントから送信されたContent-Typeヘッダーは、コンテンツ ネゴシエーションには使用されませんが、ボディ データのコンテンツ タイプを宣言するために使用されます (POSTリクエストなど)。req.is()これが、あなたの場合に呼び出す正しいメソッドではない理由ですContent-Type

于 2013-09-19T18:47:56.157 に答える