Node代理,http-proxy-middleware,POST請求失敗

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));
 
 

代理代碼實例,proxy.js 文件,https://github.com/linzl008/proxySet

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章