10

我使用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 不指示收到请求。为什么会发生这种情况,如何解决?

4

2 回答 2

9

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());
于 2013-07-25T14:26:07.450 回答
1

request 默认发出 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);
});

(代码未经测试,如果它不起作用,请告诉我,但它应该很接近)

于 2013-07-07T20:57:29.643 回答