2013-11-01 66 views
1

我是新來的Node.js,和什麼可能是一個愚蠢的問題非常抱歉......Node.js的`request.get`:存儲身體在變

這裏是我的代碼:

#!/usr/bin/env coffee --bare 

# 3rd party 
request = require('request') 
request.defaults({'encoding': 'utf8'}) 

module.exports.fetchDepartments = fetchDepartments 

fetchDepartments = (url) -> 
    _body = '' 

    getHandler = (error, response, body) -> 
     util.debug "HTTP response code: #{response.statusCode}" 

     if error 
      util.error error 
     else  
      _body = body 

    request.get(url, getHandler) 
    _body 

console.log fetchDepartments('https://ntst.umd.edu/soc/') 

控制檯正在打印致util.debug()的呼叫,但似乎_body仍爲空字符串。

...如何從HTTP響應中存儲HTML?!?

+1

歡迎來到** async **的美妙世界!你不能那樣做。 – SLaks

+0

@SLaks我有一種感覺,就是那樣的感覺。那麼,我該如何實現我的目標呢? – Zearin

+0

您需要接受回撥或退還承諾。 – SLaks

回答

2

您似乎在返回_body之前請求已完成。

該請求不是同步的,所以您幾乎可以肯定要定義一個回調。在普通的JavaScript,這將是:

fetchDepartments('https://ntst.umd.edu/soc', function (err, body) { 
    console.log(body); 
}); 

什麼是目前做的是:

  1. 初始化_body''
  2. 創建getHandler
  3. 啓動請求(但不執行!)
  4. 退回(仍爲空)_body
  5. 登錄(空)_body
  6. 後來:請求完成,調用getHandler
  7. getHandler()更新_body

你需要做的就是讓fetchDepartments接受回調函數,因此,無論代碼進程_body可以等待,直到請求完成。

+0

否 - 如果(在'getHandler()'內部)我調用'console.log(body)',HTML打印。我的問題是我需要**存儲**,而不是打印它並丟失數據。 – Zearin

+0

這是因爲'getHandler'在請求完成後異步執行。但是,您目前擁有它的地方,返回值是在請求發送後立即計算的。所以它*是*更新'_body' - 就在你已經記錄它之後。 – cloudfeet

+1

我已經擴展了我的答案,包括它當前*正在採取的步驟,試圖幫助解釋爲什麼它目前沒有工作。 – cloudfeet