我正在開發一個完全基於外部API的站點。我沒有任何服務器端邏輯。所有數據將從外部API獲取。後端服務器主要用於資產管理和路由。已經決定在後臺運行nodejs
以及expressjs
。我想知道在expressjs路由中需要做哪些修改(作爲代理),將所有來自瀏覽器的跨域ajax API調用路由到適當的站點,並將json數據路由回瀏覽器?使用Expressjs作爲跨域AJAX調用的代理
1
A
回答
3
我寫了一個將代理路由到API的小代理,但我最終放棄了它,因此可能需要更多的工作。其基本思想是:
- 阿賈克斯不能在所有的瀏覽器跨域請求
- 你必須在
http://api.example.com/
- 您的應用程序生命
http://foo.com/
- 你希望代理的一切外部的API,去
http://foo.com/api/*
至http://api.example.com/*
最好的辦法是使用Streams。您想過濾所有請求到foo.com/api/
,然後根據收到的URL向api.example.com
發送請求。然後,您將有4個對象:
- 到
foo.com
- 響應對象提出該請求
- 到
api.example.com
- 從API服務器的響應提出請求時請求
所有這些都是Streams。第一個和最後一個是可讀流,其他是可寫流。所以你想要做的是將可讀流中的任何內容寫入可寫流。你用可讀流的pipe
方法做到這一點。這看起來像:
requestFromBrowser.pipe(requestToAPI(function (responseFromAPI) {
responseFromAPI.pipe(responseToBrowser);
}));
你仍然需要手工編寫標題,並可能處理其他細節。這是我的基本代碼的樣子。它是Connect/Express的中間件。
var http = require('http');
exports.proxy = function (prefix) {
return function (req, res, next) {
var options = {
port: 3000,
// the server receives a url like http://foo.com/api/(*)
// send the proxy only (*)
path: req.url.substr(prefix.length),
// headers and the method need to be written explicitely
method: req.method,
headers: req.headers
};
if (req.url.indexOf(prefix) === 0) {
req.pipe(http.request(options, function (proxy) {
res.writeHead(proxy.statusCode, proxy.headers);
proxy.pipe(res);
}).on('error', next));
} else {
next();
}
};
};
我建議你找一個已經做到這一點的模塊。 NPM註冊表中可能有不止一個。另外,請閱讀Streams的更多內容,因爲它們非常適合編寫代理等。
相關問題
- 1. 通過使用代理跨AJAX域
- 2. 跨域AJAX調用
- 3. Ajax調用跨域
- 4. 跨域Ajax調用
- 5. AJAX跨域調用
- 6. 跨域AJAX調用
- 7. 跨域AJAX調用?
- 8. AJAX跨域調用
- 9. 跨域jQuery ajax調用不起作用
- 10. AJAX xhr.upload.addEventListener不工作的跨域調用
- 11. 使用JQuery進行跨域Ajax調用
- 12. 使用jQuery和AJAX跨域PHP調用
- 13. Ajax調用Webmethod,跨域
- 14. 跨域Ajax調用EasyXDM
- 15. 通過Ajax跨域調用
- 16. 跨域Ajax調用jquery
- 17. 讓ajax調用跨域
- 18. 跨域ajax調用:postMessage
- 19. 跨域AJAX調用問題
- 20. AJAX XML調用跨域
- 21. 來自HTML頁面的跨域Ajax調用(不能使用任何代理)
- 22. JSONP,jQuery和PHP使跨域AJAX調用
- 23. 爲什麼jsonp與跨域ajax()調用不起作用?
- 24. $ .ajax在跨域請求中失敗,即使使用apache代理
- 25. 不使用代理的跨域POST Ajax請求
- 26. 使用AJAX使用AJAX跨域數據
- 27. 跨域Ajax調用子域IE7 +
- 28. 帶有Backbone的PHP跨域(AJAX)代理
- 29. 使用ajax製作跨域請求
- 30. 問題使用JSON日期格式調用跨域代理