2016-06-19 19 views
0

にJSON応答を統合Iブラウザにsomedomain.com/some_api_url?_var1=1を入力すると、応答は11からnに及ぶ可能性が数値指標変数である{"1":"descriptive string"}、です。そして、「記述的な文字列」は、そのインデックスが何を表すかを要約したテキストです。のNode.js/Express.js応答

はどのようにして、以下の非常に単純なNode.jsExpress.js例にsomedomain.com/some_api_url?_var1=1 APIのURLからJSON responseを統合することができますか?

テスト目的で、ユーザーがhttp : // localhost : 3000をWebブラウザから要求すると、非常に単純なapp.jsが "Hello World"を返します。

Index is: 1 
Description is: descriptive string 

の代わりに「Hello World」で応答:は、具体的にどのような変化のWebブラウザがで要求に応答するように、以下のコードになされる必要がありますか?ここで

app.jsの現在のコードです:ここでは

var express = require('express'); 
var http = require('http'); 
var app = express(); 

app.get('/', function (req, res) { 
    res.send('Hello World!'); 
}); 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!'); 
}); 

Got a response: undefinedを印刷コンソールになり、私の現在の試みであり、そして何ものようにブラウザに返されませんので、ブラウザでハングアップしたままresponse

var express = require('express'); 
var http = require('http'); 
var app = express(); 

app.get('/', function (req, res) { 

    var url = 'somedomain.com/some_api_url?_var1=1'; 

    http.get(url, function(res){ 
     var body = ''; 

     res.on('data', function(chunk){ 
      body += chunk; 
     }); 

     res.on('end', function(){ 
      var fbResponse = JSON.parse(body); 
      console.log("Got a response: ", fbResponse.picture); 
     }); 
    }).on('error', function(e){ 
      console.log("Got an error: ", e); 
    }); 

}); 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!'); 
}); 

getコード例はthe example at this linkから適合させました。

答えて

1

実際には返信を忘れましたres.send(data)このようにエンドポイントコードを変更してください。また、内部応答オブジェクトには異なる変数名を使用します。私はここでresponseを使用しています。

app.get('/', function (req, res) { 

    var url = 'somedomain.com/some_api_url?_var1=1'; 

    http.get(url, function(resonse){ 
     var body = ''; 

     resonse.on('data', function(chunk){ 
      body += chunk; 
     }); 

     resonse.on('end', function(){ 
      var body = JSON.parse(body); 
      var text = ''; 
      for (var key in body){ 
        text += 'Index is: ' + key + 
          '\nDescription is: ' + body[key] 
      } 

// The Description is: "descriptive string" 
      console.log("Got a response: ", fbResponse); 
      res.send(text);    
     }); 
    }).on('error', function(e){ 
     console.log("Got an error: ", e); 
    }); 

}); 
+0

あなたのコードはブラウザで '{" 1 ":"記述的な文字列 "}'を表示し、コンソールに 'Got a response:undefined'を表示します。 OPは、OPに表示される単純なHTML出力に変換できるようにJSONをフォーマットする方法を尋ねます。このOPの目標を達成するためにコードをどのように変更しますか? – FarmHand

+0

OPはブラウザに2行で印刷するように要求します。 'Index is:1 Description is:descriptive string' – FarmHand

+0

@FarmHandこれは、応答データに画像属性がないことを意味します。 –

0

Zohaib-Ijazが指摘@として明示4.14.0

でこのコードを試してみてください、RESが再定義され、名前の変更なしres.sendのために動作しません。

その後、http.getが完了したら、オブジェクトを操作して好きなように印刷します。このコードは防御的ではないことに留意してください(このコードはデモの目的ではありません)。 JSONのエラー。

var express = require('express'); 
var http = require('http'); 
var app = express(); 

const PORT = 3000; 

app.get('/', function (req, res) { 

    var url = `http://localhost:${PORT}/some_api_url?_var1=1`; 

    http.get(url, function (resInner) { 
    var body = ''; 

    resInner.on('data', function (chunk) { 
     body += chunk; 
    }); 

    resInner.on('end', function() { 
     var fullResponse = JSON.parse(body); // {"343",:"I've heard 344 is more"} 

     // code to pair the keys with their data in plain js 
     var indexKeys = Object.keys(fullResponse); 
     var replies = indexKeys.map((key) => { 
     return `Index is ${key}\nDescription is ${fullResponse[key]}`; 
     }); 

     //note this injection of a <pre> tag is just so modern browsers 
     // will respect the newlines. it is not an HTML document or JSON 
     res.send(
     `<pre>${replies.join("\n")}</pre>` 
    ); 
    }); 
    }).on('error', function (e) { 
    console.log("Got an error: ", e); 
    }); 

}); 


app.get('/some_api_url', (req, res) => { 
    var var1 = req.query.var1 || "343"; 
    var value = `I've heard ${parseInt(var1) + 1} is more`; 
    var reply = {}; 
    reply[var1] = value; 
    res.send(JSON.stringify(reply)); 
}); 

app.listen(PORT, function() { 
    console.log(`Example app listening on port ${PORT}!`); 
}); 
+0

ありがとうございます。私は準備するために掃除を終えた瞬間にこれを試みます。しかし、一見すると、あなたのコードは配列をレスポンスに出力します。最初の変数が常にインデックス値になり、2番目の変数が常にその説明になると仮定して、それをどのように変更するのですか?これにより、より有用なコードが作成されます。 – FarmHand

+0

配列は印刷されません。 res.send()は文字列を取得します。文字列テンプレートは結合された返信配列をpreタグにラップします。これは、あなたが標準的な応答を得ていると仮定して、あなたが質問で尋ねたことを正確に出します(この明示的なアプリケーションが与えるように)。マップがどのようにキーを処理するかを参照してください。覚えておいて、jsオブジェクトには第1または第2がありません。ちょうどキーと値 – user01

0

あなたはエクスプレス、ネイティブHTTPモジュール、およびHTTPクライアントを混同しているようだ。

ここでは、あなたが探している応答を送信するためのサーバーサイドコードである。

var express = require('express'); 
var http = require('http'); 
var app = express(); 

// our "database" 
var database = ['APPLE', 'BOOK', 'CAT', 'DOG', 'ELEPHANT']; 

app.get('/', function (req, res) { 

    // apply query parsing only of the query parameter is specified 
    if ('itemId' in req.query) { 
    var itemId = req.query.itemId; 
    // index less than 0 will not yield anything from our "database" 
    if (itemId < 0) { 
     res.status(400).send('Invalid item id'); 
    // the item index corresponds to one of the items in the "database" 
    } else if (itemId < database.length) { 
     var result = 'Index: ' + itemId + '<br>Description: ' + database[itemId]; 
     res.send(result); 
    // index exceeds the size of the array, so nothing will be found 
    } else { 
     res.status(404).send('Item not found'); 
    } 
    // render the default homepage 
    } else { 
    res.send('Request format: http://localhost:3000/?itemId=n'); 
    } 

}); 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!'); 
}); 

実際に見るには、ブラウザにhttp://localhost:3000/?itemId=0をロードしてください。有効なitemIdの値は0〜4です。

+0

私はこれがOPが望んでいるとは思わない。 OPは、サーバーからHTTP GETを作成し、GETからの応答を処理してから、文字列のセットを返します。ルート '/'へのパラメータの渡しは全くありません – user01