2013-05-07 92 views
2

我剛剛開始使用Node.js.我有一個關於http.request的基本問題。我想寫一個帶有幾個函數的JavaScript模塊,它可以從一些服務器返回一些數據。使http.request返回undefined

下面的代碼:

var mod = (function() { 

    var my = {}; 
    var options = { 
     hostname: 'example.com' 
    }; 
    var foo = ''; 

    my.getBar = function() { 
     var req = http.request(options, function(res) { 
      res.setEncoding('utf8'); 
      res.on('data', function (chunk) { 
       // example.com returns JSON 
       // TODO need to be able to get foo from outside this module 
       foo = JSON.parse(chunk).bar; 
      }); 
     }); 
     req.end(); 
    } 
    return my; 
}()); 

要獲得bar我這樣做:

console.log(mod.getBar()); 

,但我得到undefined。我認爲異步事件正在發生..請求發生,並且在發生時,我嘗試打印尚未收到的結果?我認爲我需要讓它同步或什麼?

非常感謝。

回答

3

如果你看看getBar,它不會返回任何東西。這就是爲什麼你沒有定義。爲了得到結果,你不得不回調發送到getBar:

getBar = function (callback){... 

,並調用回調與最終結果:

res.on('end, function(){ 
    callback(foo); 
}); 

而且我建議你把富getBar的閉包內以防你同時做多個請求。同樣,您應該只是將數據塊連接起來,並在最後解析它,以防一個塊的響應太長。

到底你的代碼應該是這樣的:

var mod = (function() { 

    var my = {}; 
    var options = { 
     hostname: 'example.com' 
    }; 

    my.getBar = function(callback) { 
     var foo = ''; 
     var req = http.request(options, function(res) { 
      res.setEncoding('utf8'); 
      res.on('data', function (chunk) { 
       foo += chunk; 
      }); 
      res.on('end', function() { 
       callback(null, JSON.parse(foo).bar); // The null is just to adhere to the de facto standard of supplying an error as first argument 
      }); 
     }); 
     req.end(); 
    } 
    return my; 
}()); 

獲取條是這樣的:

mod.getBar(function(err, data) { 
    console.log(data); 
}); 
+0

完美,我已經學到了一些東西。謝謝。 – ale 2013-05-07 09:33:53

+1

A-ha對我有影響(關於一個明顯的事情,我已經使用mechianically但沒有想到):獲取異步的東西,你實際上將一個函數作爲參數傳遞給你的啓動函數。因此,所有這些cb(null,xxx)nulls和東西:) – Zlatko 2013-05-07 09:43:54

0

您的功能mod.getBar()沒有return語句,因此返回undefined是很自然的。

在另一方面,如果你想console.log()變量從res.on()事件的內容,則必須在該功能直接做到這一點,因爲mod.getBar()功能只重視事件聽了mod