我使用node-curl作为HTTPS客户端向Web上的资源发出请求,代码在面向Internet的代理后面的机器上运行。
我用来代码的代码:
var curl = require('node-curl');
//Call the curl function. Make a curl call to the url in the first argument.
//Make a mental note that the callback to be invoked when the call is complete
//the 2nd argument. Then go ahead.
curl('https://encrypted.google.com/', {}, function(err) {
//I have no idea about the difference between console.info and console.log.
console.info(this.body);
});
//This will get printed immediately.
console.log('Got here');
node-curl检测环境中的代理设置并返回预期结果。
挑战在于:在整个https响应被下载后,回调被触发,据我所知,http(s)模块中的'data' and 'end' events没有相似之处。
此外,在浏览完源代码后,我发现node-curl库确实以块为单位接收数据:https://github.com/jiangmiao/node-curl/blob/master/lib/CurlBuilder.js中的参考行58。在这种情况下,似乎目前没有发出任何事件。
我需要将可能相当大的响应转发回局域网上的另一台计算机进行处理,所以这对我来说是一个明显的问题。
在节点中是否为此目的使用了node-curl?
如果是,我该如何处理?
如果不是,那么什么是合适的选择呢?
答案 0 :(得分:1)
我会选择精彩的request模块,至少如果代理设置不比它支持的更高级。只需自己阅读环境中的代理设置:
var request = require('request'),
proxy = request.defaults({proxy: process.env.HTTP_PROXY});
proxy.get('https://encrypted.google.com/').pipe(somewhere);
或者,如果您不想pipe
:
var req = proxy.get({uri: 'https://encrypted.google.com/', encoding: 'utf8'});
req.on('data', console.log);
req.on('end', function() { console.log('end') });
上面,我也通过了我在回复中所期望的encoding
。您也可以在默认值(上面对request.defaults()
的调用)中指定,或者您可以保留它,在这种情况下,您将在Buffer
事件处理程序中获得data
。
如果您只想将其发送到另一个网址,请求是完美的:
proxy.get('https://encrypted.google.com/').pipe(request.put(SOME_URL));
或者你更愿意POST
:
proxy.get('https://encrypted.google.com/').pipe(request.post(SOME_URL));
或者,如果您还想将请求代理到目标服务器:
proxy.get('https://encrypted.google.com/').pipe(proxy.post(SOME_URL));