node.js – 无论如何在passportjs中设置代理设置?

目前,我正在使用基于expressjs和使用passportjs( http://passportjs.org/)进行yammer身份验证的sails框架.

在公司代理服务器后面的服务器上部署我的节点应用程序时遇到问题.它无法连接到yammer进行OAuth2身份验证.

错误如下:

error: Failed to obtain access token (Error: connect ETIMEDOUT)
    at /root/rlps/node_modules/passport-yammer/node_modules/passport-oauth/lib/passport-oauth/strategies/oauth2.js:125:38
    at /root/rlps/node_modules/passport-yammer/lib/passport-yammer/strategy.js:72:20
    at ClientRequest. (/root/rlps/node_modules/passport-yammer/node_modules/passport-oauth/node_modules/oauth/lib/oauth2.js:129:5)
    at ClientRequest.EventEmitter.emit (events.js:95:17)
    at CleartextStream.socketErrorListener (http.js:1547:9)
    at CleartextStream.EventEmitter.emit (events.js:95:17)
    at Socket.onerror (tls.js:1437:17)
    at Socket.EventEmitter.emit (events.js:117:20)
    at net.js:441:14
    at process._tickDomainCallback (node.js:459:13)

我相信这是因为代理阻止了这种方式.我试图在环境值中设置所有内容(如http_proxy和https_proxy),但似乎代码不承认它们,需要在passportjs的某个地方配置它.

那么,在passportjs中设置代理设置或在nodejs中解决此代理问题的任何好方法

解决方法

认情况下,Node.js不使用http_proxy和https_proxy变量.

您必须调整请求的代理参数,但由于您无法控制该库,因此您可以像这样全局更改:

npm i tunnel --save

创建setup_proxy.js:

var env = process.env;

if (!env['http_proxy']) return;

var localUrls = [
  'http://some-internal-url.mycompany.local',];

var url    = require('url');
var tunnel = require('tunnel');
var proxy = url.parse(env['http_proxy']);

var tunnelingAgent = tunnel.httpsOverHttp({
  proxy: {
    host: proxy.hostname,port: proxy.port
  }
});

var https = require('https');
var http = require('http');

var oldhttpsreq = https.request;
https.request = function (options,callback) {

  if (localUrls.some(function (u) {
    return ~u.indexOf(options.host);
  })){
    return oldhttpsreq.apply(https,arguments);
  }

  options.agent = tunnelingAgent;
  return oldhttpsreq.call(null,options,callback);
};

var oldhttpreq = http.request;
http.request = function (options,callback) {

  if (localUrls.some(function (u) {
    return ~u.indexOf(options.host);
  })){
    return oldhttpreq.apply(http,arguments);
  }

  options.agent = tunnelingAgent;
  return oldhttpreq.call(null,callback);
};

在最开始需要这个(‘./ setup_proxy’).

请注意,这对http和https流量使用相同的http_proxy env变量,但如果需要更改,代码很容易理解.

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...