使用Expressjs作为跨域Ajax调用的代理

我正在开发一个完全基于外部API的网站。 我没有任何服务器端的逻辑。 所有的数据将从外部API获取。 后端服务器主要用于资产pipe理和路由。 已经决定将nodejsexpressjs一起运行在后端。 我想知道在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上阅读更多,因为它们写代理之类的很棒。