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