这是我的代码:
utilitesRouter.route('/url')
.post(function(request, response) {
console.log(request.body.uri);
var urlOpts = { host: request.body.uri, path: '/', port: '80', method: 'GET' };
var re = /(<\s*title[^>]*>(.+?)<\s*\/\s*title)>/gi;
http.get(urlOpts, function (response) {
response.on('data', function (chunk) {
var str=chunk.toString();
console.log(str);
var match = re.exec(str);
if (match && match[2]) {
console.log(match[2]);
}
});
});
response.json({ url: request.body.uri });
});
如果我使用这个JSON {"uri":"google.ru" }
的POST请求,我得到:
302 Moved
google.ru
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.ru/index.html">here</A>.
</BODY></HTML>
如果我使用JSON {"uri":"http://google.ru" }
进行POST请求,我会收到错误消息:
events.js:85
throw er; // Unhandled 'error' event
^
Error: getaddrinfo ENOTFOUND http://google.ru
at errnoException (dns.js:44:10)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:94:26)
我可以在浏览器中打开http://google.ru。
如何使用node.js获取HTML?
答案 0 :(得分:1)
您可能希望request这样做。这很简单。
var request = require("request");
router.get('/proxy', function(req, res, next){
request.get( req.body.uri, function(error, response, body){
if( error )
return next(error);
res.send(body);
});
});
请求也支持流媒体和其他酷炫功能。
答案 1 :(得分:0)
您收到错误,因为在您的urlOpts
中,属性host
必须是域名,例如google.ru
或www.google.ru
。当您将URL放入其中时,无法通过DNS将其解析为IP,这就是您收到错误at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:94:26)
的原因。
如果您希望像处理http.get()
一样使用uri
,则必须从传递的google.ru
中提取域名部分,即从{{1}中获取http://google.ru
将其用作host
。