国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

Koa代理Http請求的示例代碼

來源:懂視網 責編:小采 時間:2020-11-27 22:06:30
文檔

Koa代理Http請求的示例代碼

Koa代理Http請求的示例代碼:Koa 代理http請求,解決跨域問題 1、為什么用Koa做跨域代理? 最初為了解決跨域問題,我把站點部署到了nginx上就解決了問題。一次偶然的面試機會,面試官提出了一個假設我需要對提交api和api返回的數據進行適配,那么nginx是不是就無法滿足了。當然這個問
推薦度:
導讀Koa代理Http請求的示例代碼:Koa 代理http請求,解決跨域問題 1、為什么用Koa做跨域代理? 最初為了解決跨域問題,我把站點部署到了nginx上就解決了問題。一次偶然的面試機會,面試官提出了一個假設我需要對提交api和api返回的數據進行適配,那么nginx是不是就無法滿足了。當然這個問

Koa 代理http請求,解決跨域問題

1、為什么用Koa做跨域代理?

"最初為了解決跨域問題,我把站點部署到了nginx上就解決了問題。一次偶然的面試機會,面試官提出了一個假設我需要對提交api和api返回的數據進行適配,那么nginx是不是就無法滿足了。當然這個問題的提出,讓我考慮到其實如果自己搭一個站點,通過這個站點進行轉發,適配第三方api的請求和應答不就好了。那么要搭一個站點的語言其實有很多,例如.net,java,nodejs,php...,那為什么最后選擇nodejs呢?對于我來說最重要的原因,應該就是nodejs的輕量級和javascript語言親和性。

2、搭建nodejs應用

由于Koa2剛出,畢竟學技術,那么就學最新的。

既然搭建程序那么就從程序的入口開始做,首先寫程序的路由

const fs = require('fs')
const Router = require('koa-router');
const {httpHandle} = require('../Infrastructure/httpHandle');
const koaBody = require('koa-body')({
 multipart :true
});

const render = (page) => {
 return new Promise((resolve, reject) => {
 let viewUrl = `./view/${page}`
 fs.readFile(viewUrl, "binary", (err, data) => {
 if (err) {
 reject(err)
 } else {
 resolve(data)
 }
 })
 })
}

let api = new Router();

api.get('*', httpHandle)
 .post('*', koaBody, httpHandle)
 .put('*', koaBody, httpHandle).del('*', koaBody, httpHandle);

let common = new Router();
common.get('*', async (ctx) => {
 ctx.body = await render('index.html');
})

let router = new Router();
router.use('/api', api.routes(), api.allowedMethods());
router.use('/', common.routes(), common.allowedMethods());
module.exports = router;

其次就是處理代理的請求

const httpRequest = (ctx) => {
 return new Promise((resolve) => {
 delete ctx.request.header.host;
 const options = {
 host,
 port,
 path: ctx.request.url.substr(4, ctx.request.url.length),
 method: ctx.request.method,
 headers: ctx.request.header
 }
 let requestBody='',
 body,
 head,
 chunks = [],
 fileFields,
 files,
 boundaryKey,
 boundary,
 endData,
 filesLength,
 totallength = 0;

 if (ctx.request.body) {
 console.log(ctx.request.header['content-type'])
 if (ctx.request.header['content-type'].indexOf('application/x-www-form-urlencoded') > -1) {
 requestBody = query.stringify(ctx.request.body);
 options.headers['Content-Length'] = Buffer.byteLength(requestBody)
 } else if (ctx.request.header['content-type'].indexOf('application/json') > -1) {
 requestBody = JSON.stringify(ctx.request.body);
 options.headers['Content-Length'] = Buffer.byteLength(requestBody)
 } else if (ctx.request.header['content-type'].indexOf('multipart/form-data') > -1) {
 fileFields = ctx.request.body.fields;
 files = ctx.request.body.files;
 boundaryKey = Math.random().toString(16);
 boundary = `\r\n----${boundaryKey}\r\n`;
 endData = `\r\n----${boundaryKey}--`;
 filesLength = 0;

 Object.keys(fileFields).forEach((key) => {
 requestBody += `${boundary}Content-Disposition:form-data;name="${key}"\r\n\r\n${fileFields[key]}`;
 })

 Object.keys(files).forEach((key) => {
 requestBody += `${boundary}Content-Type: application/octet-stream\r\nContent-Disposition: form-data; name="${key}";filename="${files[key].name}"\r\nContent-Transfer-Encoding: binary\r\n\r\n`;
 filesLength += Buffer.byteLength(requestBody,'utf-8') + files[key].size;
 })

 options.headers['Content-Type'] = `multipart/form-data; boundary=--${boundaryKey}`;
 options.headers[`Content-Length`] = filesLength + Buffer.byteLength(endData);
 } else {
 requestBody = JSON.stringify(ctx.request.body)
 options.headers['Content-Length'] = Buffer.byteLength(requestBody)
 }
 }

 const req = http.request(options, (res) => {
 res.on('data', (chunk) => {
 chunks.push(chunk);
 totallength += chunk.length;
 })

 res.on('end', () => {
 body = Buffer.concat(chunks, totallength);
 head = res.headers;
 resolve({head, body});
 })
 })

 ctx.request.body && req.write(requestBody);

 if (fileFields) {
 let filesArr = Object.keys(files);
 let uploadConnt = 0;
 filesArr.forEach((key) => {
 let fileStream = fs.createReadStream(files[key].path);
 fileStream.on('end', () => {
 fs.unlink(files[key].path);
 uploadConnt++;
 if (uploadConnt == filesArr.length) {
 req.end(endData)
 }
 })
 fileStream.pipe(req, {end: false})
 })
 } else {
 req.end();
 }

 })
}

由此簡單的幾行代碼就實現了通過nodejs實現跨域的請求代理。 github鏈接

nginx代理config配置 如下

server {
 listen 1024; 
 server_name tigrex:1024;
 root home/TuoTuo.v2.UI;
 index index.html;
 access_log logs/tigrex.access.log;
 error_log logs/tigrex.error.log;

 charset utf-8;
 
 location /api {
 proxy_pass http://127.0.0.1:1023/;
 proxy_set_header Host $host;
 proxy_redirect off;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 } 
 
 location / {
 try_files $uri $uri/ /index.html; 
 }
 }

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

Koa代理Http請求的示例代碼

Koa代理Http請求的示例代碼:Koa 代理http請求,解決跨域問題 1、為什么用Koa做跨域代理? 最初為了解決跨域問題,我把站點部署到了nginx上就解決了問題。一次偶然的面試機會,面試官提出了一個假設我需要對提交api和api返回的數據進行適配,那么nginx是不是就無法滿足了。當然這個問
推薦度:
標簽: 代理 請求 http
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 91精品国产91久久久久久 | 亚洲 欧美 中文字幕 | 亚洲一区 中文字幕 久久 | 国产成人免费高清激情明星 | 日韩v欧美 | 精品亚洲一区二区三区 | 中文字幕免费 | 又粗又硬又大又深又爽动态图 | 欧美久久天天综合香蕉伊 | 久草综合网 | 亚洲精品国产综合久久一线 | 亚洲三级电影在线 | 国产精选一区二区 | 久久精品一区二区影院 | 日本a黄 | 波多野结衣在线免费观看 | 亚洲三级在线 | 国产欧美另类久久精品91 | 亚洲欧美另类自拍第一页 | 国内精品久久久久久久aa护士 | 草逼电影| 欧美精品色精品一区二区三区 | 久久无码精品一区二区三区 | 亚洲 欧美综合小说区图片区 | 日韩一道本 | 亚洲韩国日本欧美一区二区三区 | 欧美综合第一页 | 亚洲欧美日韩网站 | 亚洲国语在线视频手机在线 | 亚洲激情另类 | 国产日韩中文字幕 | 激情午夜婷婷 | 夜夜操夜夜骑 | 欧美在线观看网站 | 精品国产综合区久久久久99 | 久久精品国产99久久99久久久 | 女人与公拘交酡全过程 | 欧美 亚洲 中文字幕 | 成人国产精品久久久免费 | 国产剧情精品在线 | 免费一级 一片一毛片 |