我正在运行一个开发代理服务器,在启动时我会使用我们的集群架构请求身份验证令牌。
但是,该令牌在一段时间后就会过期。然后,我不想让开发人员重新启动他们的代理服务器,而是想发出另一个请求来获取另一个有效的身份验证令牌。为了能够自己处理响应,我将该node-http-proxy选项设置selfHandleResponse为 true。
app.use(
'/',
index({
target: config.hostname,
changeOrigin: true,
onProxyReq,
onProxyRes,
selfHandleResponse: true
})
);
Run Code Online (Sandbox Code Playgroud)
现在,我只想处理带有 a 的响应401,因为这是我需要请求另一个令牌的唯一情况。
const onProxyRes = (proxyRes, req, res) => {
if (proxyRes.statusCode === 401) {
getToken()
.then(forwardRequest(req))
.then((response) => {
res.send(response.body);
})
.catch(() => {
res.sendStatus(500);
});
}
// How to pass back the original proxyRes including body, headers etc.?
});
Run Code Online (Sandbox Code Playgroud)
编辑:forwardRequest 是我的函数,用于重试原始请求,然后在成功时将其返回给客户端。
我的麻烦从这里开始,因为我不知道如何将代理的非 401 请求传递回客户端。我发现自己开始实现依赖于标头内容类型的正文解析逻辑,但我非常希望有一种更简单的方法。
有任何想法吗?
request node.js express node-http-proxy http-proxy-middleware
我有一个微服务,它代理每个请求添加一个字段。对于普通请求,这很容易,只需在request.body 中添加字段并正确设置标头,但对于 multipart/form-data 请求,我几天以来就遇到麻烦,因为如果我在request.body 中添加一个字段,它会消失。
const router = express()
const routes = require('~/routes')
const passport = require('passport')
const proxy = require('http-proxy-middleware')
router.use(passport.initialize())
require('./modules/passport-jwt')(passport)
router.use('/', routes)
router.use(
'/account',
passport.authenticate('jwt', { session: false }),
proxy({
target: process.env.ACCOUNT_SERVICE,
pathRewrite: { '/account': '/' },
onProxyReq: restream
})
)
const restream = async function (proxyReq, req, res, options) {
if (req.user) {
if (
req.headers['content-type'] &&
req.headers['content-type'].match(/^multipart\/form-data/)
) {
req.body.reqUser = req.user
} else {
const requestBody = JSON.stringify({ ...req.body, reqUser: …Run Code Online (Sandbox Code Playgroud) 我试图设置我的代理以与节点做出反应它试图在客户端的 package.json 中使用代理但是当我尝试使用 get 方法时它一直给我错误所以我搜索了另一种解决方案,我使用这个 npm 找到了这个模块(http-proxy-middleware),我运行 npm cache clean --force 命令来清除所有缓存,这样任何人都可以告诉我这是什么错误,或者如果有任何其他方法我可以尝试让我的应用程序正常工作
这是我的 server.js 文件
const express = require('express');
const connectDB = require('./config/db');
const app = express();
//connect database
connectDB();
// Init Middelware
app.use(express.json({ extended: false }));
const port = process.env.PORT || 6000;
app.get('/', (req, res) => {
res.send('api running');
});
// Define route
app.use('/api/users', require('./router/api/user'));
app.use('/api/posts', require('./router/api/post'));
app.use('/api/profile', require('./router/api/profile'));
app.use('/api/auth', require('./router/api/auth'));
app.listen(port, () => {
console.log(`server started in port ${port}`);
});
Run Code Online (Sandbox Code Playgroud)
这是我的 setupProxy.js 文件
const proxy = require('http-proxy-middleware');
module.exports …Run Code Online (Sandbox Code Playgroud) 我需要使用craco获得的变量在react中设置代理http-proxy-middleware的目标。我已经按照本指南为不同的环境提供了更多的配置文件。我有 3 个文件 local.js、development.js 和 production.js,它们是由 craco 使用不同的 npm run startlocal、startdevelopment 选择的。
在 package.json 我有:
"scripts": {
"startlocal": "cross-env CLIENT_ENV=local craco start",
"startdevelopment": "cross-env CLIENT_ENV=development craco start",
"startproduction": "cross-env CLIENT_ENV=production craco start",
Run Code Online (Sandbox Code Playgroud)
问题是我想改变代理在我什么样的环境等功能使用HTTP代理中间件我用setupProxy.js按规定指导。如果我从“环境”插入导入环境;在 setupProxy.js 我有错误意外标识符。
这是 setupProxy.js 的代码:
import environment from 'environment';
const proxy = require('http-proxy-middleware');
module.exports = function(app) {
app.use(proxy('/api', { target: 'http://localhost:5000/' }));
};
this my craco.config.js
const path = require('path');
module.exports = function({ env, paths }) {
return {
webpack: {
alias: { …Run Code Online (Sandbox Code Playgroud)