2016-06-13 79 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可以完成运行之前。