0

クライアント側で要求モジュールを使用して、ミドルウェアが接続されている REST get 要求を実行し、それを処理するノード サーバーに要求をルーティングします。問題は、リクエストモジュールを使用してリクエストを作成しているときにオプションを使用しようとしたことjson:trueです。そのため、受信したレスポンスボディを解析して検証する必要はありません。しかし、残念ながら、リクエストによって設定されたコンテンツタイプが原因でJSON(リクエストボディがない場合)を検証しているように見えるため、ミドルウェア(接続)自体で「無効なJSON」と言って失敗するため、サーバーに到達しませんモジュール。

これは、リクエストモジュールを使用して作成したリクエストです。

  request(
    {
        uri: myurl,
        json: true, //issue area
        headers: {
             //some headers. but no content-type sepcified
        }
    }
    , function (error, response, body) {
        console.log(body); 
        //Here body comes as object if json:true (not for get as it fails in validation at connect middleware itself), else i need to perform JSON.parse(body).
      }); 

jsonこれは、リクエストモジュールの設定のプロパティの定義です(ドキュメントから)。

json - 本体を値の JSON 表現に設定し、Content-type: application/json ヘッダーを追加します。さらに、応答本文を json として解析します。

しかし、明らかにそれはリクエストであり、私が設定するものGETはありません(ただし、json:trueオプションを使用すると、リクエストモジュールが内部的に設定しているようです)。content-type

以下のconnectのjson.jsスニペットからこれを追跡できます

return function json(req, res, next) {
    if (req._body) return next();
    req.body = req.body || {};
    // check Content-Type
     //This guy fails because content-type is set as application/json by request module internally
    if ('application/json' != utils.mime(req)) return next();

    // flag as parsed
    req._body = true;

    // parse
    limit(req, res, function(err){
      if (err) return next(err);
      var buf = '';
      req.setEncoding('utf8');
      req.on('data', function(chunk){ buf += chunk });
      req.on('end', function(){
    //Here the problem area obviously buf[0] is undefined
        if (strict && '{' != buf[0] && '[' != buf[0]) return next(utils.error(400, 'invalid json'));
        try {
         ......           

明らかに、これは接続の問題ではありませんが、json:trueプロパティで提供される不完全な機能である可能性があります。json:falseを使用して、応答 (JSON) を javascript オブジェクトに設定して解析できることはわかっていJSON.parse()ますが、JSON をオブジェクトに手動で検証または解析する必要がない他の要求タイプ (json:true を設定する場合) に対してこの柔軟性が得られます。リクエスト モジュールの完全なコールバックからオブジェクトとして取得します。

接続の失敗によって引き起こされるこれらの問題なしでオブジェクトとして応答本文を取得できる他のオプションがあるかどうか、またはこの動作を正当化するこの機能に関するその他の情報があるかどうかを知りたいですjson:true(何も見つかりませんでした)、または誰かが使用した他の解決策、またはこれに関する満足のいく説明も大歓迎です!! ありがとう。

4

1 に答える 1

0

他の誰かが同じ問題を経験した場合の回答を追加します。

request モジュールのソースを見ると、request の最新バージョンで既に修正されているバグのようです。したがって、古いバージョン (私の場合は 2.0.5) を使用している場合は、新しいバージョンにアップグレードすることを検討してください。

古いものには次のコードがあったため、json が true であり、本文が明示的に設定されていなくても、content-typeas ヘッダーを設定するために使用されていました。

 if (options.json) {
    options.headers['content-type'] = 'application/json' //<-- this is being set always
    if (typeof options.json === 'boolean') {
      if (typeof options.body === 'object') options.body = JSON.stringify(options.body)
    } else {
      options.body = JSON.stringify(options.json)
    }
  ......

最新バージョンでは、次のように変更されています。

  if (options.json) {
    self.json(options.json)

 //...More code 
 //and in json function

 this._json = true
  if (typeof val === 'boolean') {
    if (typeof this.body === 'object') {
      this.body = safeStringify(this.body)
      self.setHeader('content-type', 'application/json') //<-- sets it only if there is a body
    }
  } else {
    this.body = safeStringify(val)
    self.setHeader('content-type', 'application/json')
  }
于 2013-10-09T14:48:18.167 に答える