2013-07-07 32 views
7

tôi sử dụng để thực hiện request proxy sau ngược lại để CouchDB trong Express:Reverse proxy để CouchDB treo trên POST và PUT trong Node.js

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); 
}); 

Khi thực hiện các yêu cầu GET, nó hoạt động: yêu cầu đi từ khách hàng đến node.js đến CouchDB và quay lại thành công. Yêu cầu POST và PUT treo vô thời hạn. Báo cáo nhật ký chạy cho đến khi proxy, nhưng CouchDB không chỉ ra việc nhận yêu cầu. Tại sao điều này xảy ra và làm thế nào nó có thể được sửa?

Trả lời

7

Express bodyparser middleware sẽ thay đổi theo yêu cầu trong một cách mà làm đường ống để treo. Bạn không chắc chắn lý do tại sao, nhưng bạn có thể khắc phục nó bằng cách biến proxy của bạn thành phần mềm trung gian bắt được trước bodyparser. Như thế này:

// 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

yêu cầu gửi yêu cầu theo mặc định. Bạn cần đặt phương thức.

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); 
}); 

(đang chưa được kiểm tra, cho tôi biết nếu nó không hoạt động, nhưng nó phải là đóng)

+0

Aye, đã thử; không tốt. Đã cập nhật mã ví dụ để biểu thị như vậy. – garbados

Các vấn đề liên quan