クライアント側で要求モジュールを使用して、ミドルウェアが接続されている 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
(何も見つかりませんでした)、または誰かが使用した他の解決策、またはこれに関する満足のいく説明も大歓迎です!! ありがとう。