2012-01-17 25 views
3

http.createServer内のhttp.get()関数が応答しません。Node.js Http.get()関数が応答しません。

ユーザーがサーバーにリクエストを送信したときにJSONデータを取得するための小さなスニペットを書きました。ここに私のコードです。

var http = require('http'); 
var x = ''; 
http.createServer(function (request,response) { 
    http.get({ 
     host:'query.yahooapis.com', 
     path:'/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22YHOO%22%2C%22AAPL%22%2C%22GOOG%22%2C%22MSFT%22)&format=json&env=store%3A%2F%2Fdata tables.org%2Falltableswithkeys&callback=cbfunc' 
    }, function(res){ 
     res.on('data',function(d){ 
      x+=d.toString(); 
      console.log(d.toString()); 
     }) 
    }); 

    response.writeHead(200, {'Content-Type':'text/plain'}) 
    var l = JSON.parse(x.substring(7,x.length-2)); 
    response.end(l.query.results.quote[0].symbol + ''); 
}).listen(8080); 

私はエラーを取得しています:

undefined:0

SyntaxError: Unexpected end of input 
    at Object.parse (native) 
    at Server.<anonymous> (C:\Users\Lenovo\Documents\fetch.js:18:12) 
    at Server.emit (events.js:70:17) 
    at HTTPParser.onIncoming (http.js:1491:12) 
    at HTTPParser.onHeadersComplete (http.js:102:31) 
    at Socket.ondata (http.js:1387:22) 
    at TCP.onread (net.js:354:27) 

は限り私が考えるほど。エラーはx = ''が原因でjsonではなくエラーが発生するためです。しかし、localhost:8080を呼び出してリクエストを送信すると、エラーではなくコンソールにjsonのテキストが表示されます。私の目的は、株式相場をリアルタイムで解析することで、リクエストが来たときにリクエストを出し、その結果をレスポンスに設定することです。

私はそれがコンソール上に細かい上映JSONテキストを働いていますが、ユーザが要求しているとき、私は、サーバー上に展開したとき、私は一度のデータを取得するとは思わないデータに

var http = require('http'); 
var x = '/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22YHOO%22%2C%22AAPL%22%2C%22GOOG%22%2C%22MSFT%22)&format=json&env=store%3A%2F%2Fdata tables.org%2Falltableswithkeys&callback=cbfunc'; 

http.get({ 
    host: 'query.yahooapis.com', 
    path: '' 
},function(res){ 
     res.on('data',function(d){ 
     x+=d.toString(); 
     console.log(d.toString()); 
    }) 
}); 
http.createServer(function(request,response){ 
    response.writeHead(200,{'Content-Type':'text/plain'}) 
    var l=JSON.parse(x.substring(7,x.length-2)); 
    response.end(l.query.results.quote[0].symbol+''); 
}).listen(8080); 

を取得するために1つのより多くのスニペットを試してみましたデータ。エラーを解決するにはどうすればよいですか?

+0

最初の例では最後の行は存在しないはずです。 –

答えて

3

node.jsは非同期です。つまり、ある時点でhttp.getが返されます。 http.getリクエストを送信した後にimmediatlyxを操作しようとすると、http.getリクエストが完了した唯一の書き込みが完了します。

基本的にx === ''JSON.parseのコールバックで、http.getコールバックが後で実行されないためです。

var http = require('http'); 
var x = ''; 
http.createServer(function(request, response) { 
    http.get({ 
     host: 'query.yahooapis.com', 
     path: '/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22YHOO%22%2C%22AAPL%22%2C%22GOOG%22%2C%22MSFT%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=cbfunc' 
    }, function(res) { 
     res.on('data', function(d) { 
      x += d.toString(); 
      console.log(d.toString()); 
     }); 

     res.on('end', next); 
    }); 

    function next() { 
     response.writeHead(200, { 
      'Content-Type': 'text/plain' 
     }) 

     var l = JSON.parse(x.substring(7, x.length - 2)); 
     response.end(l.query.results.quote[0].symbol + ''); 
    } 
}).listen(8080); 

ここで重要なことは、あなたはJSONレスポンスを送信するまでhttp.getコールが終了するまで待つことです。

+0

お返事ありがとうございます –

関連する問題