2016-06-13 46 views
1

我使用Node.js設置了一個Web刮取器,並希望從url中獲取一些html並將其保存爲變量。一個精簡版本如下。Node.js將html作爲變量返回

var request = require('request'); 
var get_html = function(){ 
    var url = "http://www.google.com"; 
    var html = ''; 
    request.get(url,function(error, response, body){ 
     html += body; 
    }); 
    return html; 
}; 
console.log(get_html()); 

看起來函數返回之前請求可以連接到變量html的HTML。據我所見,請求只允許我在回調函數中操縱html或者將其傳遞給一個文件。無論如何只是將它作爲一個變量返回?

回答

1

request.get是異步的,它會在回調函數中返回結果。

您需要調整您的代碼有點像這樣

var request = require('request'); 

// get_html receive callback to process result 
var get_html = function(callback) { 
    var url = "http://www.google.com"; 
    var html = ''; 
    request.get(url,function(error, response, body){ 
     return callback(body); // call callback and parse result to it 
    }); 
}; 

// call get_html function 
// and log html result here 
get_html(function (body) { console.log(body); }); 

代碼有很多功能的回調看起來不漂亮。 我更喜歡承諾而不是回調。 如果您希望使用promise,請嘗試'request-promise'庫。

+1

所以它看起來像沒有辦法實際返回的HTML作爲一個字符串,只是將其餘的代碼作爲回調傳遞給請求?我的意思是把這個小函數作爲一個可以被不同模塊調用的工具。聽起來這將很快變得笨拙。 – mentoc3000

0

看起來request.get是異步的,所以你必須把return html;放在回調中。否則,它會立即返回,在request.get可以完成運行之前。