nodejs 跨域設(shè)置代理- Express和Koa2

Express

我們需要安裝 expresshttp-proxy-middleware
文章當(dāng)前版本為 node v12 "express": "~4.17.1" "http-proxy-middleware": "^0.20.0"

npm install express http-proxy-middleware

配置多個(gè)代理options(使用http-proxy-middleware的通用配置options)

const express = require('express')
const dev = process.env.NODE_ENV !== 'production'旧蛾;

const proxyOptions = {
    '/api': {
        target: 'http://testgame.quzhuanxiang.com',
        pathRewrite: {
            '^/api': ''
        },
        changeOrigin: true,
        logLevel: 'debug'
    },
    '/huyi': {
        target: '代理的測(cè)試域名/正式域名',
        pathRewrite: {
            '^/huyi': ''
        },
        changeOrigin: true,
        logLevel: 'debug'
    },
}

遍歷配置express使用多個(gè)跨域代理

    const server = express()
    // 需要在處理body之前代理氮凝,否則可能會(huì)有奇怪的問(wèn)題
    if (dev && proxyOptions) {
        const proxyMiddleware = require('http-proxy-middleware')
        Object.keys(proxyOptions).forEach(function (context) {
            server.use(proxyMiddleware(context, proxyOptions[context]))
        })
    }

配置成功運(yùn)行酣衷,調(diào)用跨域url時(shí)終端會(huì)輸出類似這樣的信息:

[HPM] Proxy created: /api  -> http://testgame.quzhuanxiang.com
[HPM] Proxy rewrite rule created: "^/api" ~> ""

檢測(cè)到/api的請(qǐng)求,請(qǐng)求最終會(huì)變成:
http://localhost:3000/api/service/testApi => http://testgame.quzhuanxiang.com/service/testApi
根據(jù)proxyOptions配置记罚,url/api部分會(huì)被pathRewrite為''空字符串

Koa2

koa 是由 Express 原班人馬打造浅妆,比express更輕一些望迎,所以代理配置上與express基本一樣。有很多其他的代理的庫(kù)都是基于http-proxy-middleware的凌外,我們用這個(gè)就行辩尊。
我們需要安裝 Koa2http-proxy-middleware 康辑、koa2-connect

遍歷配置express使用多個(gè)跨域代理

const proxyMiddleware = require('http-proxy-middleware');
const k2c = require('koa2-connect');
const Koa = require('koa2')
const dev = process.env.NODE_ENV !== 'production'摄欲;

if (dev && proxyOptions) {
    Object.keys(proxyOptions).forEach(function (context) {
      server.use(async (ctx, next) => {
        if (ctx.url.startsWith(context)) {
          ctx.respond = false;
          await k2c(proxyMiddleware(context, proxyOptions[context]))(ctx, next);
        }
        await next();
      })
    })
  }

另配上一份完整的koa2配置,包括body參數(shù)處理疮薇,router胸墙,session,跨域代理按咒,redis等迟隅。
該文使用庫(kù)的版本"koa-body": "^4.2.0" "koa-router": "^10.0.0" "koa-session": "^6.2.0" "koa2": "^2.0.0-alpha.7" "koa2-connect": "^1.0.2" "koa2-cors": "^2.0.6"

const next = require('next')
const Koa = require('koa2')
const KoaBody = require('koa-body')
const cors = require('koa2-cors')
const proxyMiddleware = require('http-proxy-middleware');
const k2c = require('koa2-connect');
const { router, setRedis } = require('./util/routerUtil') // 封裝的router處理,api接口等
const session = require('koa-session')
const Redis = require('ioredis')
const RedisSessionStore = require('./util/session-store') // 封裝的redis get set destroy等數(shù)據(jù)處理
// redis
const redis = new Redis()
setRedis(redis);

const proxyOptions = {// 可配置多個(gè)代理
  '/huyi': {
    target: process.env.SERV_ENV === 'release' ? '正式域名' : '測(cè)試域名',
    pathRewrite: {
      '^/huyi': ''
    },
    changeOrigin: true,
    logLevel: 'debug'
  },
}

const port = parseInt(process.env.PORT, 10) || 3000
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()

app.prepare().then(() => {
  const server = new Koa();
  let redisStore = new RedisSessionStore(redis);
  server.keys = ['KEY'];
  const SESSION_CONFIG = {
    key: 'dj.sid',
    store: redisStore,
    prefix: 'dj:sess',
    cookie: {
      path: '/',
      httpOnly: true
    }
  }
  // 允許跨域
  server.use(cors());
  // 配置session
  server.use(session(SESSION_CONFIG, server));

  if (dev && proxyOptions) {
    Object.keys(proxyOptions).forEach(function (context) {
      server.use(async (ctx, next) => {
        if (ctx.url.startsWith(context)) {
          ctx.respond = false;
          await k2c(proxyMiddleware(context, proxyOptions[context]))(ctx, next);
        }
        await next();
      })
    })
  }

  server
    .use(router.allowedMethods())
    .use(KoaBody())// 使用body參數(shù)励七,注意:要放在use(router)之前處理完參數(shù)智袭,再傳到router
    .use(router.routes()) // 使用api、請(qǐng)求攔截掠抬、重定向等等路由操作
    .use(async (ctx, next) => {
      await handle(ctx.req, ctx.res)
      ctx.respond = false
    })

  server.on('error', (err, ctx) => {
    if (ctx) {
      ctx.body = {
        code: 9999,
        message: `程序運(yùn)行出錯(cuò):${err}`
      }
    }
  })
  
  server.listen(port, err => {
    if (err) throw err
    console.log(`> Ready on http://localhost:${port}`)
  })
})

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吼野,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子两波,更是在濱河造成了極大的恐慌瞳步,老刑警劉巖闷哆,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谚攒,居然都是意外死亡阳准,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)馏臭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)野蝇,“玉大人,你說(shuō)我怎么就攤上這事括儒∪粕颍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵帮寻,是天一觀的道長(zhǎng)乍狐。 經(jīng)常有香客問(wèn)我,道長(zhǎng)固逗,這世上最難降的妖魔是什么浅蚪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮烫罩,結(jié)果婚禮上惜傲,老公的妹妹穿的比我還像新娘。我一直安慰自己贝攒,他們只是感情好盗誊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著隘弊,像睡著了一般哈踱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梨熙,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天开镣,我揣著相機(jī)與錄音,去河邊找鬼咽扇。 笑死哑子,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肌割。 我是一名探鬼主播卧蜓,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼把敞!你這毒婦竟也來(lái)了弥奸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奋早,失蹤者是張志新(化名)和其女友劉穎盛霎,沒(méi)想到半個(gè)月后赠橙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愤炸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年期揪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片规个。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凤薛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诞仓,到底是詐尸還是另有隱情缤苫,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布墅拭,位于F島的核電站活玲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谍婉。R本人自食惡果不足惜舒憾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望穗熬。 院中可真熱鬧镀迂,春花似錦、人聲如沸死陆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)措译。三九已至,卻和暖如春饰序,著一層夾襖步出監(jiān)牢的瞬間领虹,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工求豫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留塌衰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓蝠嘉,卻偏偏與公主長(zhǎng)得像最疆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蚤告,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容