如何在openshift托管的nodejs上使用express-cloudant设置反向代理

时间:2014-01-07 23:28:46

标签: node.js express couchdb openshift cloudant

当我想从另一台主机上的网站访问我的couchdb时,我遇到了跨域策略问题。所以我在openshift上设置了一个nodejs来创建一个带有express-cloudant的反向代理。 在修改了openshift中的nodejs app示例之后,我现在能够访问通过app.get设置的索引和自述文件

self.app.get('/', routesDir.index);
self.app.get('/readme', require('./routes/readme'));

但是当涉及到应该重定向到我的cloudant couchdb的代理时,我最终得到了错误503。 这就是我如何设置代理(来自https://github.com/cloudant-labs/express-cloudant中的app.js示例)

proxy = require('./routes/proxy'),
http = require('http'),
path = require('path'),
proxy_url = "https://" +
        process.env.USERNAME +
        ".cloudant.com",
admin_url = "https://" +
        process.env.USERNAME +
        ":" +
        process.env.PASSWORD +
        "@" +
        process.env.USERNAME +
        ".cloudant.com";    self.app = express();

    //Cloudant
    self.app.set('port', process.env.PORT || 3000);
    console.log('Port: ' + self.app.get('port'));
    self.app.set('views', __dirname + '/views');
    self.app.set('view engine', 'jade');
    self.app.use(express.favicon());
    self.app.use(express.logger('dev'));
 // all requests to /proxy* get forwarded to Cloudant through the proxy
    self.app.use(proxy('proxy', proxy_url));
    self.app.use(express.bodyParser());
    self.app.use(express.methodOverride());
    self.app.use(self.app.router);
    self.app.use(express.static(path.join(__dirname, 'public')));

    // development only
    if ('development' == self.app.get('env')) {
      self.app.use(express.errorHandler());
    }

    self.app.get('/', routesDir.index);
    self.app.get('/readme', require('./routes/readme'));
    require('./routes/api')(self.app, 'api', admin_url);

proxy.js的内容(我未经修改):

module.exports = function(prefix, proxy_url){
  return function(req, res, next){
    var proxy_path = req.path.match(RegExp("^\\/" + prefix + "(.*)$"));
    console.log('Proxy path: ' + proxy_path);
    if(proxy_path){
      var db_url = proxy_url + proxy_path[1];
      req.pipe(request({
        uri: db_url,
        method: req.method,
        qs: req.query
      })).pipe(res);
    } else {
      next();
    }
  };
};

我的请求如下:

curl -vX POST http://myproxy-myappws.rhcloud.com/proxy/_session -H 'application/x-www-form-urlencoded' -d 'name=myuser&password=mypassword'

最终出现错误503

当我尝试使用相同的请求时:

curl -vX POST https://me.cloudant.com/_session -H 'application/x-www-form-urlencoded' -d 'name=myuser&password=mypassword'

效果很好。

我是nodejs和express-cloudant的新手,所以也许我错过了一件非常重要的事情。 有任何信息,方向,提示吗?

1 个答案:

答案 0 :(得分:0)

如果您在openshift上运行该脚本,则需要侦听端口8080以使其可从外部访问,或者侦听OPENSHIFT_NODEJS_PORT。