2

Node.jsのリクエストモジュールを使用してサーバーをリクエストするウェブクライアントを開発しています。送信されるリクエストはPOSTリクエストです。サーバーは、Expressを使用してNode.jsで記述されています。プロキシとして機能し、Node.jsで記述されたサーバーにリクエストをリダイレクトするNGINXの別のレイヤーがあります。

問題は次のとおりです。ヘッダーを明示的に定義せずにリクエストを送信しようとすると、NGINXはcontent-length、#411(長さが必要)のhtmlエラーを送信します。一方、ブラウザとカールを使用して同様のリクエストを送信しようとすると、すべてが正常に機能します。サンプルコードは次のとおりです。

request.post(url, function(err, response, data) {
     if(err) {
         console.log(err);
     } else {
         console.log(data);
     }
}).form({'data':'someValue'})

さらに、リクエストのヘッダーにcontent-lengthを追加すると、NGINXがハングし、NGINXはさらにデータが到着するのを待っているようです。NGINXはリクエストをサーバーに転送しません。

content-lengthを含めるために追加されたオプション

var dataObj = {'data' = 'someValue'};

var options = {
    'uri' = url
    , 'headers' = {
        'Content-Length' = JSON.stringify(dataObj).length
    } 
};


    request.post(options, function(err, response, data) {
         if(err) {
             console.log(err);
         } else {
             console.log(data);
         }
    }).form({'data':'someValue'});

リクエストの送信で何が間違っていますか?

4

1 に答える 1

2

解決策を見つけました。JSONデータを送信していました。間違いはform()、ヘッダーを「Content-type: application/x-www-form-urlencoded; charset=utf-8」に設定する関数を使用していたことです。依頼資料より引用

form - オブジェクトが渡されると、body が設定されますが、値のクエリ文字列表現に設定され、Content-type: application/x-www-form-urlencoded; が追加されます。charset=utf-8 ヘッダー。オプションが渡されない場合、要求にパイプされる FormData インスタンスが返されます。auth - 値を含むハッシュ user || ユーザー名、パスワード || pass、および sendImmediately (オプション)。上記のドキュメントを参照してください。json - 本体を値の JSON 表現に設定し、Content-type: application/json ヘッダーを追加します。さらに、応答本文を json として解析します。

jsonオプションを使用form()して機能を削除すると、正常に動作するようになりました。

于 2013-03-04T12:03:13.043 に答える