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 相关文章推荐
学习YUI.Ext基础第一天
Mar 10 Javascript
文本框的字数限制功能jquery插件
Nov 24 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
Aug 15 Javascript
JS实现的一个简单的Autocomplete自动完成例子
Apr 16 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
Oct 24 Javascript
Vue一个案例引发的递归组件的使用详解
Nov 15 Javascript
angular中如何绑定iframe中src的方法
Feb 01 Javascript
vue动态子组件的两种实现方式
Sep 01 Javascript
Weex开发之地图篇的具体使用
Oct 16 Javascript
vue中在vuex的actions中请求数据实例
Nov 08 Javascript
构建大型 Vue.js 项目的10条建议(小结)
Nov 14 Javascript
JS函数本身的作用域实例分析
Mar 16 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实现函数内修改外部变量值的方法示例
2018/12/28 PHP
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
javascript中的parseInt和parseFloat区别
2013/07/12 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
jquery分页对象使用示例
2014/04/01 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
2015/04/24 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
JS原型与继承操作示例
2019/05/09 Javascript
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
[02:47]3.19DOTA2发布会 国服成长历程回顾
2014/03/25 DOTA
[49:20]2014 DOTA2国际邀请赛中国区预选赛5.21 CIS VS TongFu
2014/05/22 DOTA
python list中append()与extend()用法分享
2013/03/24 Python
python 2.6.6升级到python 2.7.x版本的方法
2016/10/09 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
python如何求100以内的素数
2020/05/27 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
CSS3制作圆角图片和椭圆形图片
2016/07/08 HTML / CSS
土木工程师职业规划范文
2014/03/07 职场文书
财务部岗位职责
2015/02/03 职场文书
安娜卡列尼娜观后感
2015/06/11 职场文书
2019年销售人员的职业生涯规划书
2019/03/25 职场文书
2019年度行政文员工作计划范本!
2019/07/04 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python