2014-09-30 23 views
5

tôi sử dụng mã nút-express sau để yêu cầu proxy từ một máy chủ web đến một máy chủ API:yêu cầu proxy json với nút hiện

app.use('/api', function(req, res) { 
    var url = 'http://my.domain.com/api' + req.url; 
    req.pipe(request(url)).pipe(res); 
}); 

này hoạt động tốt cho các yêu cầu đơn giản của bất kỳ động từ (nhận được, bưu điện, vv ...), tuy nhiên khi tôi gửi yêu cầu 'Content-type': 'application/json', yêu cầu này bị treo trên đường dây pipe.

Tại sao mã proxy tốc độ nút đơn giản này treo trên yêu cầu json?
Làm cách nào để sửa đổi chúng?

+1

Bạn đang sử dụng một cơ quan phân tích cú pháp middleware trước đó mà tuyến đường đã được đọc tất cả các dữ liệu yêu cầu? – mscdex

+0

@mscdex Tôi đang làm việc trên [dự án tạo ra yeoman góc cạnh đầy đủ] (https://www.npmjs.org/package/generator-angular-fullstack). Tôi thấy dự án [sử dụng gói phân tích cú pháp cơ thể] (https://github.com/DaftMonk/fullstack-demo/blob/master/server/config/express.js), vì vậy câu trả lời có thể là có – Jonathan

+1

Hãy thử di chuyển của bạn middleware tùy chỉnh lên trước khi phần mềm trung gian phân tích cú pháp cơ thể (hoặc thậm chí làm cho nó là phần mềm trung gian đầu tiên) và xem nó có giúp ích gì không. – mscdex

Trả lời

16

Bạn cần phải di chuyển mà chức năng tùy chỉnh middleware trướcthis line để nó thực hiện trước khi bất kỳ phân tích cú pháp cơ thể. Điều này đảm bảo rằng dữ liệu yêu cầu vẫn ở đó cho đường ống đến request(url) trong phần mềm trung gian tùy chỉnh của bạn.

Nguyên nhân của hiện treo là req không có dữ liệu để viết thư cho request(url) (vì cơ thể phân tích cú pháp middleware đã đọc tất cả các dữ liệu yêu cầu và phân tích nó) và vì vậy nó không bao giờ gọi .end() trên dòng request(url). Điều này có nghĩa là yêu cầu để url không bao giờ hoàn thành bởi vì nó chỉ ngồi đó chờ đợi dữ liệu mà nó sẽ không bao giờ nhận được.

+0

ném một lỗi sẽ là thiết kế tốt hơn trong mắt tôi. Tôi cũng mong đợi 'phân tích cú pháp cơ thể' chỉ phân tích dữ liệu và không trích xuất dữ liệu từ' req' – Jonathan

+0

Vâng, để phân tích cú pháp yêu cầu, nó phải đọc dữ liệu từ luồng yêu cầu. Khi tất cả dữ liệu yêu cầu đã được đọc, nó đã biến mất.Với stream2 tôi đoán bạn * có thể * có thể unshift tất cả các dữ liệu trở lại dòng yêu cầu, nhưng điều đó có nghĩa là bạn phải đệm tất cả điều đó và điều đó có thể rất có vấn đề nếu ai đó tải lên một tệp lớn chẳng hạn. – mscdex

+0

hai câu hỏi sau đó: 1) không 'cơ thể phân tích cú pháp' cung cấp quyền truy cập vào các json phân tích cú pháp? và tôi có thể phát lại nó vào 'yêu cầu (url)' không? 2) có thể có một lý do tại sao [các tuyến được gọi sau khi thể hiện] (https://github.com/DaftMonk/fullstack-demo/blob/72cf7510244c577a0ed4d139cfa6fd4922ddd47d/server/app.js#L29), nó là gì? và nếu như vậy tôi nên thực sự đầu tiên proxy và chỉ sau đó quá trình và sau đó tuyến đường?! sao proxy không phải là một phần của định tuyến sau khi xử lý cục bộ? – Jonathan

2

Trong trường hợp của một bài yêu cầu, xây dựng sau hoạt động:

app.post('/api/method', (req, res) => { 
    req.pipe(request.post(someUrl, { json: true, body: req.body }), { end: false }).pipe(res); 
} 

Đây là khóa học có liên quan nếu bạn đang sử dụng middleware bodyparser.

+0

Đây chính xác là những gì tôi đang tìm kiếm. Đăng một số JSON, proxy nó qua express, trả về phản hồi từ API. Xuất sắc! – Richard

0

app.use('/api', function(req, res) { 
 
    var url = 'http://my.domain.com/api' + req.url; 
 
    
 
    request({ 
 
      uri: url, 
 
      method: "POST", 
 
      body: _body, 
 
      json: true 
 
     }, function (_err, _res, _resBody) { 
 
      //do somethings 
 
      res.json(_resBody); 
 
     }); 
 

 
});

+0

Bạn nên giải thích tại sao mã của bạn là một cải tiến. –

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