CouchDB的反向代理在Node.js中的POST和PUT上挂起

时间:2013-07-07 20:18:05

标签: node.js express couchdb

我使用request在Express中为CouchDB实现以下反向代理:

app.all(/^\/db(.*)$/, function(req, res){
  var db_url = "http://localhost:5984/db" + req.params[0];
  req.pipe(request({
    uri: db_url,
    method: req.method
  })).pipe(res);
});

在发出GET请求时,它可以工作:请求从客户端到node.js再到CouchDB并成功返回。 POST和PUT请求无限期挂起。日志语句一直运行到代理,但CouchDB不表示收到请求。为什么会发生这种情况,如何解决?

2 个答案:

答案 0 :(得分:7)

Express'bodyparser中间件以导致管道挂起的方式修改请求。不知道为什么,但你可以通过将代理放入在bodyparser之前捕获的中间件来解决它。像这样:

// wherever your db lives
var DATABASE_URL = 'http://localhost:5984/db';

// middleware itself, preceding any parsers
app.use(function(req, res, next){
  var proxy_path = req.path.match(/^\/db(.*)$/);
  if(proxy_path){
    var db_url = DATABASE_URL + proxy_path[1];
    req.pipe(request({
      uri: db_url,
      method: req.method
    })).pipe(res);
  } else {
    next();
  }
});
// these blokes mess with the request
app.use(express.bodyParser());
app.use(express.cookieParser());

答案 1 :(得分:1)

请求默认发出get请求。您需要设置方法。

app.all(/^\/db(.*)$/, function(req, res){
  var db_url = ["http://localhost:5984/db", req.params[0]].join('/');
  req.pipe(request({
    url: db_url,
    method: url.method
  })).pipe(res);
});

(未经测试的代码,如果它不起作用,请告诉我,但它应该关闭)