使用Expressjs作为跨域Ajax调用的代理
我正在开发一个完全基于外部API的网站。 我没有任何服务器端的逻辑。 所有的数据将从外部API获取。 后端服务器主要用于资产pipe理和路由。 已经决定将nodejs
与expressjs
一起运行在后端。 我想知道在expressjs路由中需要做什么修改(作为代理),从浏览器到相应的站点的所有跨域ajax API调用,并将json数据路由回浏览器?
我写了一个将代理路由到API的小代理,但是我最终放弃了代理,因此可能需要更多的工作。 基本的想法是:
- Ajax无法在每个浏览器中进行跨域请求
- 您在
http://api.example.com/
拥有外部API - 您的应用程序位于
http://foo.com/
- 您想要将
http://foo.com/api/*
所有内容都代理到http://api.example.com/*
最好的方法是使用Streams 。 您希望过滤所有的请求到foo.com/api/
,然后根据收到的URL向api.example.com
发送一个请求。 你将有4个对象:
- 对
foo.com
的请求 - 该请求的响应对象
- 对
api.example.com
的请求 - 来自API服务器的响应
所有这些都是stream。 第一个和最后一个是可读stream,其他是可写stream。 所以你想要做的是将任何来自可读stream的内容写入可写入stream。 你用可读stream的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(); } }; };
我build议你找一个已经做到这一点的模块。 NPMregistry中可能有不止一个。 此外,在Streams上阅读更多,因为它们写代理之类的很棒。