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 ミドルウェアは、パイプがハングするような方法でリクエストを変更します。理由はわかりませんが、プロキシをボディパーサーの前にキャッチするミドルウェアにすることで修正できます。このような:

// 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 に答える