2011-09-25 33 views
8

Tôi phát triển một ứng dụng web, chống lại api. Khi api không chạy trên hệ thống cục bộ của tôi, tôi cần ủy quyền yêu cầu để không chạy các vấn đề về miền chéo. Có một cách dễ dàng để làm điều này vì vậy index.html của tôi sẽ gửi từ địa phương và tất cả các yêu cầu GET, POST, PUT, DELETE khác đi tới xyz.net/apiEndPoint.Proxy với nodejs

Edit:

đây là giải pháp đầu tiên của tôi, nhưng didnt làm việc

var express = require('express'), 
    app = express.createServer(), 
    httpProxy = require('http-proxy'); 


app.use(express.bodyParser()); 
app.listen(process.env.PORT || 1235); 

var proxy = new httpProxy.RoutingProxy(); 

app.get('/', function(req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 
app.get('/js/*', function(req, res) { 
    res.sendfile(__dirname + req.url); 
}); 
app.get('/css/*', function(req, res) { 
    res.sendfile(__dirname + req.url); 
}); 

app.all('/*', function(req, res) { 
    proxy.proxyRequest(req, res, { 
     host: 'http://apiUrl', 
     port: 80 
    }); 

}); 

Nó sẽ phục vụ chỉ mục, js, css file nhưng không lộ phần còn lại cho các api bên ngoài. Đây là thông báo lỗi tôi có:

An error has occurred: {"stack":"Error: ENOTFOUND, Domain name not found\n at IOWatcher.callback (dns.js:74:15)","message":"ENOTFOUND, Domain name not found","errno":4,"code":"ENOTFOUND"} 

Trả lời

4

Hãy xem readme for http-proxy. Nó có một ví dụ về làm thế nào để gọi proxyRequest:

proxy.proxyRequest(req, res, { 
    host: 'localhost', 
    port: 9000 
}); 

Dựa trên các thông báo lỗi, có vẻ như bạn đang đi qua một tên miền giả vào những phương pháp proxyRequest.

+0

Bạn đúng là máy chủ bắt đầu bằng 'http: //'. Việc xóa này sẽ khắc phục nó. Nhưng biết tôi đã nhận được phản hồi trống: Yêu cầu HTTP HTTP/1.1 400 X-Powered-By: Express máy chủ: Apache-Coyote/1.1 nội dung dài: 0 ngày: Sun, 25 Sep 2011 18:06: 22 GMT kết nối: đóng –

+0

@ AndreasKöberle, để bắt đầu, tôi khuyên bạn nên chỉnh sửa câu hỏi này hoặc mở một câu hỏi mới. –

+1

Ok tôi đã hỏi một câu hỏi mới. http://stackoverflow.com/questions/7559862/proxy-with-nodejs-and-express –

0

Có lẽ bạn nên xem câu trả lời của tôi here. Ở đây tôi sử dụng gói yêu cầu để gửi mọi yêu cầu đến một proxy và gửi trả lời cho người yêu cầu.

2

Các câu trả lời khác hơi lỗi thời.

Dưới đây là làm thế nào để sử dụng http-proxy 1.0 với tốc:

var httpProxy = require('http-proxy'); 

var apiProxy = httProxy.createProxyServer(); 

app.get("/api/*", function(req, res){ 
    apiProxy.web(req, res, { target: 'http://google.com:80' }); 
}); 
1

Dưới đây là một ví dụ về proxy mà có thể sửa đổi cơ thể request/response.

Nó đánh giá mô-đun through triển khai luồng đọc/ghi trong suốt.

var http = require('http'); 
var through = require('through'); 

http.createServer(function (clientRequest, clientResponse) { 

    var departureProcessor = through(function write(requestData){ 

     //log or modify requestData here 
     console.log("=======REQUEST FROM CLIENT TO SERVER CAPTURED========"); 
     console.log(requestData); 

     this.queue(requestData); 
    }); 

    var proxy = http.request({ hostname: "myServer.com", port: 80, path: clientRequest.url, method: 'GET'}, function (serverResponse) { 

     var arrivalProcessor = through(function write(responseData){ 

      //log or modify responseData here 
      console.log("======RESPONSE FROM SERVER TO CLIENT CAPTURED======"); 
      console.log(responseData); 

      this.queue(responseData); 
     }); 

     serverResponse.pipe(arrivalProcessor); 
     arrivalProcessor.pipe(clientResponse); 
    }); 

    clientRequest.pipe(departureProcessor, {end: true}); 
    departureProcessor.pipe(proxy, {end: true}); 

}).listen(3333);