使用 express.js 代理

编程入门 行业动态 更新时间:2024-10-23 09:27:29
本文介绍了使用 express.js 代理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

为了避免同域 AJAX 问题,我希望我的 node.js Web 服务器将来自 URL /api/BLABLA 的所有请求转发到另一台服务器,例如 other_domain:3000/BLABLA,并将此远程服务器返回的相同内容透明地返回给用户.

To avoid same-domain AJAX issues, I want my node.js web server to forward all requests from URL /api/BLABLA to another server, for example other_domain:3000/BLABLA, and return to user the same thing that this remote server returned, transparently.

所有其他 URL(除了 /api/*)都将直接提供,没有代理.

All other URLs (beside /api/*) are to be served directly, no proxying.

我如何使用 node.js + express.js 实现这一点?能举个简单的代码例子吗?

How do I achieve this with node.js + express.js? Can you give a simple code example?

(Web 服务器和远程 3000 服务器都在我的控制之下,都运行 node.js 和 express.js)

(both the web server and the remote 3000 server are under my control, both running node.js with express.js)

到目前为止我发现了这个 github/http-party/node-http-proxy ,但阅读那里的文档并没有让我更明智.我结束了

So far I found this github/http-party/node-http-proxy , but reading the documentation there didn't make me any wiser. I ended up with

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", port: 3000 }); });

但是没有任何东西返回给原始 Web 服务器(或最终用户),所以没有运气.

but nothing is returned to the original web server (or to the end user), so no luck.

推荐答案

您想使用 http.request 创建一个对远程 API 的类似请求并返回其响应.

You want to use http.request to create a similar request to the remote API and return its response.

像这样:

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', // 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(); });

注意:我还没有真正尝试过上面的方法,所以它可能包含解析错误,希望这会给你一个关于如何让它工作的提示.

更多推荐

使用 express.js 代理

本文发布于:2023-10-12 16:53:37,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1485308.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:express   js

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!