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 相关文章推荐
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
Jul 31 Javascript
js中取得变量绝对值的方法
Jan 03 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
Apr 05 Javascript
JS实现两表格里数据来回转移的方法
May 28 Javascript
javascript处理a标签超链接默认事件的方法
Jun 29 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
Nov 10 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
Sep 14 Javascript
js实现简单的二级联动效果
Mar 09 Javascript
React-router 4 按需加载的实现方式及原理详解
May 25 Javascript
Vue实现表格中对数据进行转换、处理的方法
Sep 06 Javascript
为什么要使用Vuex的介绍
Jan 19 Javascript
解决layui使用layui-icon出现默认图标的问题
Sep 11 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 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
php使用pear_smtp发送邮件
2016/04/15 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
2016/12/09 PHP
PHP读取Excel类文件
2017/05/15 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
基于jQuery的倒计时插件代码
2011/05/07 Javascript
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
2013/07/05 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
python中日志logging模块的性能及多进程详解
2017/07/18 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
python 借助numpy保存数据为csv格式的实现方法
2018/07/04 Python
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
Python OpenCV实现视频分帧
2019/06/01 Python
python程序 创建多线程过程详解
2019/09/23 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
python如何安装下载后的模块
2020/07/03 Python
工商管理实习生自我鉴定范文
2013/12/18 职场文书
益达广告词
2014/03/14 职场文书
协议书与合同的区别
2014/04/18 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
今日说法观后感
2015/06/08 职场文书
干部理论学习心得体会
2016/01/21 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
Python的三个重要函数详解
2022/01/18 Python