Node.js配合node-http-proxy解决本地开发ajax跨域问题


Posted in Javascript onAugust 31, 2016

情景:

前后端分离,本地前端开发调用接口会有跨域问题,一般有以下3种解决方法:

1. 后端接口打包到本地运行(缺点:每次后端更新都要去测试服下一个更新包,还要在本地搭建java运行环境,麻烦)

2. CORS跨域:后端接口在返回的时候,在header中加入'Access-Control-Allow-origin':* 之类的(有的时候后端不方便这样处理,前端就蛋疼了)

3. 用nodejs搭建本地http服务器,并且判断访问接口URL时进行转发,完美解决本地开发时候的跨域问题。

 用到的技术:

1. nodejs搭建本地http服务器

2. 应用node-http-proxy,做接口url的转发

具体方法:

1. node.js搭建本地http服务器参考了shawn.xie的《nodejs搭建本地http服务器》

2. node.js做转发使用node-http-proxy实现,官方文档:https://github.com/nodejitsu/node-http-proxy#using-https

3. 操作方法参考了:http://hao.jser.com/archive/10394/?utm_source=tuicool&utm_medium=referral

4. 下面是我自己的实战操作

项目准备

1. npm初始化

npm init

2. 安装node-http-proxy模块

npm install http-proxy --save-dev

3. 项目结构

Node.js配合node-http-proxy解决本地开发ajax跨域问题

下面的例子中,我们把html文件直接放在根目录'./',也可以指定一个网站目录,在proxy.js中可以自定义

配置HTTP服务器和PROXY转发

var PORT = 3000;
var http = require('http');
var url=require('url');
var fs=require('fs');
var mine=require('./mine').types;
var path=require('path');
var httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({
target: 'http://192.168.10.38:8180/', //接口地址
// 下面的设置用于https
// ssl: {
// key: fs.readFileSync('server_decrypt.key', 'utf8'),
// cert: fs.readFileSync('server.crt', 'utf8')
// },
// secure: false
});
proxy.on('error', function(err, req, res){
res.writeHead(500, {
'content-type': 'text/plain'
});
console.log(err);
res.end('Something went wrong. And we are reporting a custom error message.');
});
var server = http.createServer(function (request, response) {
var pathname = url.parse(request.url).pathname;
//var realPath = path.join("main-pages", pathname); // 指定根目录
var realPath = path.join("./", pathname);
console.log(pathname);
console.log(realPath);
var ext = path.extname(realPath);
ext = ext ? ext.slice(1) : 'unknown';
//判断如果是接口访问,则通过proxy转发
if(pathname.indexOf("mspj-mall-admin") > 0){
proxy.web(request, response);
return;
}
fs.exists(realPath, function (exists) {
if (!exists) {
response.writeHead(404, {
'Content-Type': 'text/plain'
});
response.write("This request URL " + pathname + " was not found on this server.");
response.end();
} else {
fs.readFile(realPath, "binary", function (err, file) {
if (err) {
response.writeHead(500, {
'Content-Type': 'text/plain'
});
response.end(err);
} else {
var contentType = mine[ext] || "text/plain";
response.writeHead(200, {
'Content-Type': contentType
});
response.write(file, "binary");
response.end();
}
});
}
});
});
server.listen(PORT);
console.log("Server runing at port: " + PORT + ".");

MINE.JS

这里参考shawn.xie的源码,补充了几个字体文件的mime。

exports.types = {
"css": "text/css",
"gif": "image/gif",
"html": "text/html",
"ico": "image/x-icon",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"js": "text/javascript",
"json": "application/json",
"pdf": "application/pdf",
"png": "image/png",
"svg": "image/svg+xml",
"swf": "application/x-shockwave-flash",
"tiff": "image/tiff",
"txt": "text/plain",
"wav": "audio/x-wav",
"wma": "audio/x-ms-wma",
"wmv": "video/x-ms-wmv",
"xml": "text/xml",
"woff": "application/x-woff",
"woff2": "application/x-woff2",
"tff": "application/x-font-truetype",
"otf": "application/x-font-opentype",
"eot": "application/vnd.ms-fontobject"
};

以上就是全部源码

然后把项目中的接口地址改成http://localhost:3000/......

启动nodejs服务

启动cmd,定位到项目目录,运行

node proxy.js

访问:

http://localhost:3000/index.html

可以看到项目中调用的http://localhost:3000/..... 都会从http://192.168.10.38:8180/...... 获取数据,然后转发到本地。

这样就不存在跨域了。

以上所述是小编给大家介绍的Node.js配合node-http-proxy解决本地开发ajax跨域问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
怎么判断js脚本加载完成
Feb 28 Javascript
js实现可兼容IE、FF、Chrome、Opera及Safari的音乐播放器
Feb 11 Javascript
创建自己的jquery表格插件
Nov 25 Javascript
jQuery通过deferred对象管理ajax异步
May 20 Javascript
Bootstrap实现input控件失去焦点时验证
Aug 04 Javascript
JS动态添加选项案例分析
Oct 17 Javascript
Vue配合iView实现省市二级联动的示例代码
Jul 27 Javascript
vue观察模式浅析
Sep 25 Javascript
浅谈webpack+react多页面开发终极架构
Nov 11 Javascript
jQuery实现滑动开关效果
Aug 02 jQuery
Postman环境变量全局变量使用方法详解
Aug 13 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
Aug 19 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
Aug 31 #Javascript
基于JavaScript实现点击页面任何位置返回
Aug 31 #Javascript
jquery datatable服务端分页
Aug 31 #Javascript
关于javascript原型的修改与重写(覆盖)差别详解
Aug 31 #Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
Aug 31 #Javascript
浅谈JavaScript 覆盖原型以及更改原型
Aug 31 #Javascript
javascript 将共享属性迁移到原型中去的实现方法
Aug 31 #Javascript
You might like
PHP如何将XML转成数组
2016/04/04 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
Javascript 复制数组实现代码
2009/11/26 Javascript
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
jQuery之过滤元素操作小结
2013/11/30 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
分享15个大家都熟知的jquery小技巧
2015/12/02 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
使用python读取csv文件快速插入数据库的实例
2018/06/21 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
Python GUI编程完整示例
2019/04/04 Python
python对XML文件的操作实现代码
2020/03/27 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
使用CSS变量实现炫酷惊人的悬浮效果
2019/04/26 HTML / CSS
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
科研先进个人典型材料
2014/01/31 职场文书
领导干部作风建设总结
2014/10/23 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
通知范文怎么写
2015/04/16 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
运动会广播稿50字
2015/08/19 职场文书
升学宴家长答谢词
2015/09/29 职场文书