1

我正在开发一个完全基于外部 API 的网站。我没有任何服务器端逻辑。所有数据都将从外部 API 获取。后端服务器主要用于资产管理和路由。已决定nodejsexpressjs. 我想知道在expressjs路由中需要进行哪些修改以将来自浏览器的所有跨域ajax API调用(作为代理)路由到适当的站点并将json数据路由回浏览器?

4

1 回答 1

3

我编写了一个将调用路由到 API 的小代理,但我最终放弃了它,因此这可能需要更多的工作。基本思想是:

  • Ajax 无法在每个浏览器中进行跨域请求
  • 您有一个外部 API,位于http://api.example.com/
  • 您的应用程序位于http://foo.com/
  • 你想代理所有去到http://foo.com/api/*的东西http://api.example.com/*

最好的方法是使用Streams。您想要过滤所有请求,然后根据收到的 URLfoo.com/api/发出请求。api.example.com然后,您将拥有 4 个对象:

  • 提出的要求foo.com
  • 该请求的响应对象
  • 提出的要求api.example.com
  • 来自 API 服务器的响应

所有这些都是流。第一个和最后一个是可读流,其他是可写流。因此,您要做的是将来自可读流的任何内容写入可写流。您可以使用可读流的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 的内容,因为它们非常适合编写代理等。


于 2013-01-16T14:36:12.653 回答