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 相关文章推荐
关于使用runtimeStyle属性问题讨论文章
Mar 08 Javascript
JavaScript 中的事件教程
Apr 05 Javascript
两个DIV等高的JS的实现代码
Dec 23 Javascript
js封装的textarea操作方法集合(兼容很好)
Nov 16 Javascript
jquery方法+js一般方法+js面向对象方法实现拖拽效果
Aug 30 Javascript
jquery实现手风琴效果实例代码
Nov 15 Javascript
js隐式全局变量造成的bug示例代码
Apr 22 Javascript
JS判断、校验MAC地址的2个实例
May 05 Javascript
详解Vue如何支持JSX语法
Nov 10 Javascript
webpack打包js的方法
Mar 12 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
Sep 02 Javascript
vue 实现单选框设置默认选中值
Nov 07 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
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
JavaScript 继承详解(三)
2009/07/13 Javascript
php上传图片并给图片打上透明水印的代码
2010/06/07 Javascript
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
JS实现来回出现文字的状态栏特效代码
2015/10/31 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
JavaScript实现滚动加载更多
2020/12/27 Javascript
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
pygame实现俄罗斯方块游戏
2018/06/26 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
摄影实习自我鉴定
2013/09/20 职场文书
关于是否需要写商业计划书
2014/02/07 职场文书
学校万圣节活动方案
2014/02/13 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
银行贷款委托书范本
2014/10/11 职场文书
共青团员自我评价
2015/03/10 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
2016年社区“6.26”禁毒日宣传活动总结
2016/04/05 职场文书
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python