为了避免同域AJAX问题,我希望我的node.js Web服务器将所有请求从URL转发/api/BLABLA到另一个服务器,例如other_domain.com:3000/BLABLA,并透明地将与该远程服务器返回的相同的内容返回给用户。
/api/BLABLA
other_domain.com:3000/BLABLA
所有其他网址(位于旁边/api/*)均应直接提供,不能进行代理。
/api/*
如何使用node.js + express.js实现此目的?您可以举一个简单的代码示例吗?
(Web服务器和远程3000服务器都在我的控制下,都运行带有express.js的node.js)
3000
到目前为止,我发现了这个https://github.com/http-party/node-http- proxy,但是阅读那里的文档并没有使我更加明智。我最终以
var proxy = new httpProxy.RoutingProxy(); app.all("/api/*", function(req, res) { console.log("old request url " + req.url) req.url = '/' + req.url.split('/').slice(2).join('/'); // remove the '/api' part console.log("new request url " + req.url) proxy.proxyRequest(req, res, { host: "other_domain.com", port: 3000 }); });
但没有任何内容返回到原始Web服务器(或最终用户),因此没有运气。
您想用来http.request创建与远程API类似的请求并返回其响应。
http.request
像这样:
const http = require('http'); // or use import http from 'http'; /* your app config here */ app.post('/api/BLABLA', (oreq, ores) => { const options = { // host to forward to host: 'www.google.com', // port to forward to port: 80, // path to forward to path: '/api/BLABLA', // request method method: 'POST', // headers to send headers: oreq.headers, }; const creq = http .request(options, pres => { // set encoding pres.setEncoding('utf8'); // set http status code based on proxied response ores.writeHead(pres.statusCode); // wait for data pres.on('data', chunk => { ores.write(chunk); }); pres.on('close', () => { // closed, let's end client request as well ores.end(); }); pres.on('end', () => { // finished, let's finish client request as well ores.end(); }); }) .on('error', e => { // we got an error console.log(e.message); try { // attempt to set error message and http status ores.writeHead(500); ores.write(e.message); } catch (e) { // ignore } ores.end(); }); creq.end(); });
注意:我还没有真正尝试过上面的方法,因此它可能包含解析错误,希望这会提示您如何使其工作。