Node代理,http-proxy-middleware,POST請求失敗
http-proxy-middleware,POST請求失敗
因爲 bodyParser 導致的代理轉發帶有 body 數據的 post 請求會失敗
var express = require('express');
var cookieParser = require('cookie-parser');
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
解決方案1:
代理中加上把解析後的 body 數據再轉回來即可
const proxy = require('http-proxy-middleware');
var restream = function(proxyReq, req, res, options) {
if (req.body) {
let bodyData = JSON.stringify(req.body);
// incase if content-type is application/x-www-form-urlencoded -> we need to change to application/json
proxyReq.setHeader('Content-Type','application/json');
proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData));
// stream the content
proxyReq.write(bodyData);
}
}
var apiProxy = proxy('/api', {
target: 'https://xxx.xxx.xxx.xxx',
secure: false,
changeOrigin: true,
onProxyReq: restream
});
app.use(apiProxy);
解決方案2
使用express-http-proxy插件:
const proxy = require('express-http-proxy');
// 反向代理(這裏把需要進行反代的路徑配置到這裏即可)
let opts = {
preserveHostHdr: true,
reqAsBuffer: true,
//轉發之前觸發該方法
proxyReqPathResolver: function(req, res) {
//這個代理會把匹配到的url(下面的 ‘/api’等)去掉,轉發過去直接404,這裏手動加回來,
req.url = req.baseUrl+req.url;
return require('url').parse(req.url).path;
},
}
app.use('/api',proxy('https://xxx.xxx.xxx.xxx',opts));