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 相关文章推荐
Prototype Function对象 学习
Jul 12 Javascript
JQuery困惑—包装集 DOM节点
Oct 16 Javascript
JavaScript中各种编码解码函数的区别和注意事项
Aug 19 Javascript
javascript写的日历类(基于pj)
Dec 28 Javascript
JavaScript中通过prototype属性共享属性和方法的技巧实例
Mar 13 Javascript
浅谈setTimeout 与 setInterval
Jun 23 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
Nov 04 Javascript
获取jqGrid中选择的行的数据
Nov 30 Javascript
JS生成一维码(条形码)功能示例
Jan 19 Javascript
javascript深拷贝的原理与实现方法分析
Apr 10 Javascript
Angular项目从新建、打包到nginx部署全过程记录
Dec 09 Javascript
node中modules.exports与exports导出的区别
Jun 08 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开发框架总结收藏
2008/04/24 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
实践中学习AngularJS表单
2016/03/21 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
2018/09/18 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
2019/08/20 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
python检测是文件还是目录的方法
2015/07/03 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
2019/01/15 Python
django 中QuerySet特性功能详解
2019/07/25 Python
django框架用户权限中的session缓存到redis中的方法
2019/08/06 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
Python列表list操作相关知识小结
2020/01/29 Python
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
什么是GWT的Entry Point
2013/08/16 面试题
医科大学生的自我评价
2013/12/04 职场文书
大学生自荐书范文
2013/12/10 职场文书
学习十八大坚定理想信念心得体会
2014/03/11 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
于丹论语心得观后感
2015/06/15 职场文书
公务员岗前培训心得体会
2016/01/08 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书
员工工作心得体会
2019/05/07 职场文书
解析Redis Cluster原理
2021/06/21 Redis
Go语言测试库testify使用学习
2022/07/23 Golang
华为HarmonyOS3.0强在哪? 看看鸿蒙3.0这7个小功能
2023/01/09 数码科技