预约微信小程序开发_Koa代理Http请求的示例代码

摘要: Koa代理商Http恳求的实例编码 本文关键详细介绍了Koa代理商Http恳求的实例编码,详细说明详细介绍了Koa 代理商http恳求,处理跨域难题,网编感觉挺好的,如今共享给大伙儿,也给...

Koa代理Http请求的示例代码       这篇文章主要介绍了Koa代理Http请求的示例代码,详解介绍了Koa 代理http请求,解决跨域问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

"最初为了解决跨域问题,我把站点部署到了nginx上就解决了问题。一次偶然的面试机会,面试官提出了一个假设我需要对提交api和api返回的数据进行适配,那么nginx是不是就无法满足了。当然这个问题的提出,让我考虑到其实如果自己搭一个站点,通过这个站点进行转发,适配第三方api的请求和应答不就好了。,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);
mon = new Router();
common.get('*', async (ctx) = {
 ');
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实现跨域的请求代理。

nginx代理config配置 如下

server {
 listen 1024; 
 server_name tigrex:1024;
 root home/TuoTuo.v2.UI;
 ;
 access_log logs/tigrex.access.log;
 error_log logs/tigrex.error.log;
 charset utf-8;
 location /api {
 proxy_pass ;
 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 / {
 ; 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持凡科。




联系我们

全国服务热线:4000-399-000 公司邮箱:343111187@qq.com

  工作日 9:00-18:00

关注我们

官网公众号

官网公众号

Copyright?2020 广州凡科互联网科技股份有限公司 版权所有 粤ICP备10235580号 客服热线 18720358503

技术支持:html网页模板