我也把这个发布到了相关的问题上http-proxy.
我正在使用http-proxy,express所以我可以拦截我的客户端和api之间的请求,以便添加一些cookie进行身份验证.
为了进行身份验证,客户端必须发送一个POST请求x-www-form-urlencoded作为content-type.所以我使用body-parser中间件来解析请求体,以便我可以在请求中插入数据.
http-proxy与使用问题,body-parser恐怕是因为它分析的身体流,永远不会关闭它,因此代理从来就不曾完成请求.
http-proxy示例中有一个解决方案,在解析了我尝试使用的请求之后"重新流式传输".我也尝试connect-restreamer在同一个问题上使用该解决方案,但没有运气.
我的代码看起来像这样
var express = require('express'),
bodyParser = require('body-parser'),
httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({changeOrigin: true});
var restreamer = function (){
return function (req, res, next) { //restreame
req.removeAllListeners('data')
req.removeAllListeners('end')
next()
process.nextTick(function () {
if(req.body) {
req.emit('data', req.body) //error gets thrown here
}
req.emit('end')
})
}
}
var app = express();
app.use(bodyParser.urlencoded({extended: false, …Run Code Online (Sandbox Code Playgroud) 我在节点应用程序中使用以下模块中的revese代理
https://github.com/nodejitsu/node-http-proxy
我的问题是我是否需要修改反向代理状态的标头以像标准一样工作?
我使用以下模块,它适用于反向代理 https://github.com/nodejitsu/node-http-proxy 目前我使用的代码如下例
httpProxy.createServer({
target: 'ws://localhost:9014',
ws: true
}).listen(8014);
Run Code Online (Sandbox Code Playgroud)
我的问题是如何检查/模拟 websockets是否正常工作?任何测试都会有所帮助......
我有一个简单的基于Express的Node.js Web服务器,我用它来开发JavaScript应用程序.我将服务器设置为使用node-http-proxy来代理应用程序对在不同域和端口上运行的Jetty服务器发出的API请求.这个设置一直运行良好,直到我开始遇到会话管理问题.
在验证后,应用程序服务器返回一个带有代表服务器会话的auth令牌的cookie.当我从我的文件系统(文件://)运行JS应用程序时,我可以看到,一旦客户端收到cookie,它就会在所有后续API请求中发送.当我在节点服务器上运行JS应用程序并通过node-http-proxy(RoutingProxy)代理API调用时,请求标头永远不会包含cookie.
我需要手动处理以通过代理支持这种类型的会话持久性吗?我一直在挖掘node-http-proxy代码,但它有点过头了,因为我是Node的新手.
https://gist.github.com/2475547或:
var express = require('express'),
routingProxy = require('http-proxy').RoutingProxy(),
app = express.createServer();
var apiVersion = 1.0,
apiHost = my.host.com,
apiPort = 8080;
function apiProxy(pattern, host, port) {
return function(req, res, next) {
if (req.url.match(pattern)) {
routingProxy.proxyRequest(req, res, {host: host, port: port});
} else {
next();
}
}
}
app.configure(function () {
// API proxy middleware
app.use(apiProxy(new RegExp('\/' + apiVersion + '\/.*'), apiHost, apiPort));
// Static content middleware
app.use(express.methodOverride());
app.use(express.bodyParser());
app.use(express.static(__dirname));
app.use(express.errorHandler({
dumpExceptions: true,
showStack: true
})); …Run Code Online (Sandbox Code Playgroud) 我正在使用ember和express over node设计一个网站.它在服务器中运行,例如:SERVER_1.
我在另一台服务器上运行的web服务很少,比如说:SERVER_2.
那是:
SERVER_1中的网站和SERVER_2中提供的Web服务
SERVER_1位于代理服务器后面.我试图从SERVER_1访问webservices:
SERVER_1 =====[PROXY]===> SERVER_2
Run Code Online (Sandbox Code Playgroud)
当我从SERVER_1进行AJAX webservice调用时,我收到:
NetworkError: 500 Internal Server Error
Run Code Online (Sandbox Code Playgroud)
但是,我能够通过浏览器成功检索值.只有通过AJAX代码,我才检索到网络500错误.
另外,为了测试,我删除了我的代理服务器设置:
SERVER_1 =====> SERVER_2
Run Code Online (Sandbox Code Playgroud)
我能够通过AJAX代码和浏览器成功访问所有这些Web服务.
如果我之间有代理服务器:
SERVER_1 =====[PROXY]===> SERVER_2
Run Code Online (Sandbox Code Playgroud)
我收到了 - NetworkError:500内部服务器错误
我想知道从代理服务器后面运行的网站访问第三方Web服务的过程?
附加信息:
已经修复跨域Web服务访问问题(在一个服务器上运行的网站和在不同端口的其他一些服务器上运行的webservices),我使用的是http-proxy npm,我的代码如下:
var express = require('express');
var routes = require('./routes');
var http = require('http');
var path = require('path');
var httpProxy = require('http-proxy');
var endpoint = {
host: 'IP_ADDRESS_WHERE_MY_WEBSERVICES_RUN',
port: 80,
prefix: '/api'
}
var proxy = new httpProxy.RoutingProxy();
var app = express();
app.set('port', process.env.PORT || …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用node-http-proxy作为反向代理,但我似乎无法使POST和PUT请求起作用.文件server1.js是反向代理(至少对于具有url"/ forward-this"的请求),server2.js是接收代理请求的服务器.请解释一下我做错了什么.
这是server1.js的代码:
// File: server1.js
//
var http = require('http');
var httpProxy = require('http-proxy');
httpProxy.createServer(function (req, res, proxy) {
if (req.method == 'POST' || req.method == 'PUT') {
req.body = '';
req.addListener('data', function(chunk) {
req.body += chunk;
});
req.addListener('end', function() {
processRequest(req, res, proxy);
});
} else {
processRequest(req, res, proxy);
}
}).listen(8080);
function processRequest(req, res, proxy) {
if (req.url == '/forward-this') {
console.log(req.method + ": " + req.url + "=> I'm going to forward this.");
proxy.proxyRequest(req, res, { …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用websockets node-http-proxy.区别在于我使用的是proxytable:
var options = {
router: {
'a.websterten.com': '127.0.0.1:150',
'b.websterten.com' : '127.0.0.1:151',
}
};
var server = httpProxy.createServer(options);
Run Code Online (Sandbox Code Playgroud)
我试过了:
server.on('upgrade', function (req, socket, head) {
server.proxy.proxyWebSocketRequest(req, socket, head);
});
Run Code Online (Sandbox Code Playgroud)
但它似乎没有用.快速检查一下websockets是否可以显示我Unexpected response code: 400从Chrome 获取的信息(如果我直接使用,则可以正常工作)
做一些检查server.on('upgrade',..也不会触发websocket请求
如何让我的代理服务器正确路由websockets?
我也在节点0.8.23以及节点0.10.x上尝试了这个(节点的更高版本有内存泄漏问题,但它也不能在0.8.23上工作)
问题陈述-
我们在互联网客户端和下游服务之间使用路由器.路由器(服务)是用Node.js编写的.其责任是将互联网客户端的请求传递给相应的下游服务,并将响应返回给互联网客户端.我们在路由器级别面临一些延迟.
用于http代理的库 -
https://github.com/nodejitsu/node-http-proxy
node-http-proxy 示例 -
用示例示例解释.我们在99%的案件中面临问题 -
我们使用100并发进行了负载/性能测试.
根据结果,直到95百分位,响应时间对于互联网客户来说是很好的.
但是,在99百分位数,下游服务在预期时间(~250ms)内响应.但是路由器的时间比预期多10倍(~2500毫秒).
服务信息 -
路由器和下游服务都在同一区域和同一子网中.所以,这种延迟不是因为网络.
延迟的可能性 -
分析这个 -
我们在配置下面蠢蠢欲动 -
keepAlive,maxSockets,maxFreeSockets,keepAliveMsecs,日志级别.PLease check http/https代理的节点配置 - http代理配置
节点服务的代码片段 -
var httpProxy = require('http-proxy');
var http = require('http');
var https = require('https');
var agent = new https.Agent({
maxSockets: nconf.get(25),
keepAlive: true,
maxFreeSockets: nconf.get(10),
keepAliveMsecs : nconf.get(5000)
});
var proxy = httpProxy.createServer({ agent: agent });
var domain = require('domain');
var requestTimeout = parseInt(nconf.get('REQUEST_TIMEOUT'));
process.env.UV_THREADPOOL_SIZE = nconf.get(4);
Run Code Online (Sandbox Code Playgroud)
问题 -
有人可以帮助我了解初始连接前数百毫秒内发生的事情吗?
它只发生在每个其他请求上,如图所示。
请求是针对 ASP.NET Core Web 应用程序对 localhost 上的相同资源发出的 POST。
我也看过其他类似的问题和答案,但我没有看到在初始连接之前什么都没有的例子。其他人似乎都有一个“停顿”或“排队”的酒吧。
“短”请求如下所示:
Chrome 版本:74.0.3729.131(官方版本)(64 位)
更新 1:这在 Microsoft Edge 中不会发生。每个请求都很短。不用等。
更新 2:下载一个长请求的 HAR 文件显示一个很长的“连接”时间:
"timings": {
"blocked": 1.135999995024409,
"dns": 0.0030000000000000027,
"ssl": -1,
"connect": 301.202,
"send": 0.18900000000002137,
"wait": 79.29900000206612,
"receive": 3.750999996555038,
"_blocked_queueing": 0.8449999950244091
},
Run Code Online (Sandbox Code Playgroud)
短的连接时间为 -1:
"timings": {
"blocked": 0.9680000060191378,
"dns": -1,
"ssl": -1,
"connect": -1,
"send": 0.091,
"wait": 50.74499999642931,
"receive": 2.582000000984408,
"_blocked_queueing": 0.8130000060191378
},
Run Code Online (Sandbox Code Playgroud)
但为什么?
更新 3:事实证明,这只发生在通过 webpack-dev-server 代理时。我也会添加那个标签。尽管如此,它仍然只发生在 Chrome 中。
更新 4:现在似乎是这种情况的摘要,使用时会出现该模式:
切换到 vite 后,我尝试模仿proxy: "http://localhost:5000"我之前使用的package.json
这是我的 vite 配置
export default defineConfig({
plugins: [react()],
server: {
proxy: {
"/api": {
target: "http://localhost:5000",
changeOrigin: true,
secure: false,
},
},
},
});
Run Code Online (Sandbox Code Playgroud)
我有在端口 3000 上运行的 React 应用程序。当我在根 url ( ) 中发送请求时,http://localhost:3000一切正常
const { data } = await axios.get("api/user/me");
http://localhost:3000/api/user/me而不是http://localhost:5000/api/user/me. 谁能解释这种行为?主要问题是,当我导航到另一个页面(例如http://localhost:3000/dashboard)时,相同的请求会发送到http://localhost:3000/dashboard/api/user/me.
我究竟做错了什么?我想将请求发送至http://localhost:5000,无论位置如何
我找到了一个解决方法,在每个请求之前指定 FE url const { data } = await axios.get("http://localhost:3000/api/user/me");,但仍然有办法模仿package.json代理行为吗?
node-http-proxy ×10
node.js ×9
javascript ×4
proxy ×4
express ×2
websocket ×2
body-parser ×1
ember.js ×1
http-proxy ×1
https ×1
reactjs ×1
sockets ×1
vite ×1
web-services ×1
webproxy ×1