2

我使用 node-curl 作为 HTTPS 客户端来向网络上的资源发出请求,并且代码在面向 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-response 下载完成后回调会被触发,据我所知,来自 http(s) 模块的'data' 和 'end' 事件没有相似之处。

再看源码,发现node-curl库确实是分块接收数据的:参考https://github.com/jiangmiao/node-curl/blob/master/lib/CurlBuilder中的第58行。 js。在这种情况下,目前似乎没有发出任何事件。

我需要将可能相当大的响应转发回我 LAN 上的另一台计算机进行处理,所以这对我来说是一个明显的问题。

是否建议在节点中为此目的使用 node-curl?

如果是,我该如何处理?

如果不是,那么什么是合适的替代方案?

4

1 回答 1

1

我会选择美妙的请求模块,至少如果代理设置不比它支持的更高级。只需自己从环境中读取代理设置:

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()上面的调用),或者您可以保留它,在这种情况下您将在事件处理程序中获得Buffers 。data

如果您只想将其发送到另一个 URL,那么 request 非常适合:

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));
于 2012-07-11T14:44:56.817 回答