亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node 代理訪問的實現

發布時間:2020-10-19 01:47:27 來源:腳本之家 閱讀:143 作者:D_Q_ 欄目:web開發

NODE代理訪問

1. 場景

  • 本地開發,代理訪問,防止跨域(一般通過webpack配置代理即可),特殊情況如攜帶一些自定義的登錄cookie則需要通過自己寫node
  • 作為一種server中間層,單線程異步可以緩解服務器壓力。長鏈接websocket通常使用node搭建

2. 技術框架

  • node - koa2 體量小,輕便易用。
  • 路由koa-router koa配套路由,中間件支持async
  • koa2-request 基于async對 request的封裝,這里本人git上找的,可靠性帶考量,若基于生產環境建議使用request自行封裝
  • koa-bodyparser 請求參數解析格式化-中間件

3. 上代碼

3.1 創建應用 app.js

const Koa = require('koa')
const bodyParser = require('koa-bodyparser')
// 路由
const router = require('./router')
const app = new Koa()

app.use(
 bodyParser({
   // 返回的對象是一個鍵值對,當extended為false的時候,鍵值對中的值就為'String'或'Array'形式,為true的時候,則可為任何數據類型。
  extended: true 
 })
)

3.2 允許跨域 app.js

app.use(async (ctx, next) => {
 ctx.set('Access-Control-Allow-Origin', '*')
 ctx.set('Access-Control-Allow-Headers', 'content-type')
 ctx.set(
  'Access-Control-Allow-Methods',
  'OPTIONS,GET,HEAD,PUT,POST,DELETE,PATCH'
 )
 await next()
})

3.2 使用路由

// app.js

app.use(router.routes())


// router.js

const Router = require('koa-router')
let koaRequest = require('./httpRequest')
const router = new Router()

router.get('/*', async (ctx, next) => {
 const url = setQuestUrl(ctx.url)
 try {
  let res = await koaRequest(url, 'GET', ctx)
  ctx.body = res
 } catch (err) {
  ctx.body = err
 }
})

router.post('/*', async (ctx, next) => {
 const url = setQuestUrl(ctx.url)
 try {
  let res = await koaRequest(url, 'POST', ctx)
  ctx.body = res
 } catch (err) {
  ctx.body = err
 }
})

function setQuestUrl(url) {
 if (/^\/t/.test(url)) {
  return 'host1'+ url.replace(/^\/t/, '')
 }
 if (/^\/xt/.test(url)) {
  return 'host2' + url.replace(/^\/xt/, '')
 }
}

module.exports = router
  • router.get('/*', async (ctx, next) => {}) koa路由 ‘/*' 為通配符,匹配所有get請求;next方法調用表示進入下一個中間件;
  • ctx請求上下文,ctx.request.body post請求參數
  • koa的中間件原理 洋蔥圈模型:

Node 代理訪問的實現

const Koa = require('koa2');
const app = new Koa();

// logger
app.use(async (ctx, next) => {
 console.log('第一層洋蔥 - 開始')
 await next();
 const rt = ctx.response.get('X-Response-Time');
 console.log(`${ctx.method} ${ctx.url} - ${rt}`);
 console.log('第一層洋蔥 - 結束')
});

// x-response-time
app.use(async (ctx, next) => {
 console.log('第二層洋蔥 - 開始')
 const start = Date.now();
 await next();
 const ms = Date.now() - start;
 ctx.set('X-Response-Time', `${ms}ms`);
 console.log('第二層洋蔥 - 結束')
});

// response
app.use(async ctx => {
 console.log('第三層洋蔥 - 開始')
 ctx.body = 'Hello World';
 console.log('第三層洋蔥 - 結束')
});

app.listen(8000);


// 輸出

第一層洋蔥 - 開始
第二層洋蔥 - 開始
第三層洋蔥 - 開始

第三層洋蔥 - 結束
第二層洋蔥 - 結束
第一層洋蔥 - 結束

setQuestUrl 此方法主要是將前端訪問的路徑,根據第一級轉發到不同的host上

例如: /t -> host1

3.3 轉發請求 httpRequest.js

本例主要為了代理訪問并攜帶Cookie, const.js 為寫死的要攜帶的cookie

let koa2Req = require('koa2-request')

let constConfig = require('./const')

let iToken = constConfig.iToken

let koaRequest = async function(url, method, ctx) {
 let options = {
  method: method,
  uri: url,
  timeout: 120000,
  body: ctx
   ? {
     ...ctx.request.body
    }
   : null,
  headers: {},
  json: true // Automatically stringifies the body to JSON
 }
 options.headers['Cookie'] = `i-token=${iToken}` //設置cookie
 let res = await koa2Req(options)

 return res.body
}

// node-mon

async function getTestToken() {
 if (!constConfig.iToken) {
  let url = `http://xt.eqxiu.com/tui/app/radar/test/getToken?companyId=${constConfig.companyId}&staffId=${constConfig.staffId}`
  try {
   let res = await koaRequest(url, 'GET')
   iToken = res.obj
   console.log('token已拿到:' + iToken)
  } catch (e) {
   console.log(e)
  }
 }
}

getTestToken()

module.exports = koaRequest

3.4 最后設置端口等

const app = require('./app')
//const createWebsocket = require('./websocket')

const server = require('http').createServer(app.callback())

server.setTimeout(2 * 60 * 1000) //設置超時時間

const { PORT = 3000 } = process.env

server.listen(PORT, () => {
 console.log(`Listening on port ${PORT}`)
})

3.5 本地開發,熱重啟

安裝 nodemon

yarn add nodemon

設置忽略監聽

nodemon.josn node項目根目錄下

{
 "ignore": ["node_modules/*"] //忽略node_modules下文件修改的監聽
}

package.josn

通過npm run server啟動

{
 "dependencies": {
  "koa": "^2.8.1",
  "koa-bodyparser": "^4.2.1",
  "koa-router": "^7.4.0",
  "koa2-request": "^1.0.4",
  "nodemon": "^1.19.1"
 },
 "scripts": {
  "server": "nodemon index.js"
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海伦市| 宝鸡市| 嵊泗县| 开封县| 合肥市| 丰原市| 文成县| 石泉县| 新民市| 泗水县| 甘肃省| 瑞金市| 安乡县| 边坝县| 朝阳区| 滦平县| 五常市| 古交市| 如东县| 张家港市| 崇明县| 孟津县| 金湖县| 九江市| 青冈县| 平谷区| 彝良县| 庆云县| 昌吉市| 辉县市| 英吉沙县| 新源县| 鲁山县| 盐津县| 靖安县| 凤山市| 西峡县| 普兰县| 阿拉善盟| 保靖县| 大荔县|