为了避免同域 AJAX 问题,我希望我的 node.js Web 服务器将所有请求从 URL 转发/api/BLABLA到另一台服务器,例如other_domain.com:3000/BLABLA,并以透明方式向用户返回该远程服务器返回的相同内容。
/api/BLABLA
other_domain.com:3000/BLABLA
所有其他 URL(旁边/api/*)将直接提供,无需代理。
/api/*
如何使用 node.js + express.js 实现这一点?你能举一个简单的代码例子吗?
(Web 服务器和远程3000服务器都在我的控制之下,都运行 node.js 和 express.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(); });
注意:我还没有真正尝试过上面的方法,所以它可能包含解析错误,希望这会给你一个关于如何让它工作的提示。