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 相关文章推荐
用JavaScript脚本实现Web页面信息交互
Oct 11 Javascript
jQuery动画效果animate和scrollTop结合使用实例
Apr 02 Javascript
js调试系列 初识控制台
Jun 18 Javascript
Angular中$cacheFactory的作用和用法实例详解
Aug 19 Javascript
详解angularJs中自定义directive的数据交互
Jan 13 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
May 09 Javascript
写给vue新手们的vue渲染页面教程
Sep 01 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
Dec 25 Javascript
AngularJS集合数据遍历显示的实例
Dec 27 Javascript
详解plotly.js 绘图库入门使用教程
Feb 23 Javascript
highCharts提示框中显示当前时间的方法
Jan 18 Javascript
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
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通过cookies获取远程网页的指定代码
2013/06/25 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
PHP 断点续传实例详解
2017/11/11 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
原生的html元素选择器类似jquery选择器
2014/10/15 Javascript
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
2015/05/04 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
基于jquery实现省市区三级联动效果
2015/12/25 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
解决nodejs中使用http请求返回值为html时乱码的问题
2017/02/18 NodeJs
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
vue中的模态对话框组件实现过程
2018/05/01 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
2018/09/21 Javascript
JavaScript实现简单计算器功能
2019/12/19 Javascript
python中pycurl库的用法实例
2014/09/30 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
python是否适合网页编程详解
2019/10/04 Python
python绘制无向图度分布曲线示例
2019/11/22 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
纯CSS3实现圆圈动态发光特效动画的示例代码
2021/03/08 HTML / CSS
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
XML文档面试题
2015/08/05 面试题
大一自我鉴定范文
2013/10/04 职场文书
实习期自我鉴定
2013/10/11 职场文书
营销与策划实训报告
2014/11/05 职场文书
员工自我评价范文
2015/03/11 职场文书
法律意见书范文
2015/05/20 职场文书
公司人事管理制度
2015/08/05 职场文书
高中地理教学反思
2016/02/19 职场文书
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL
Python 数据科学 Matplotlib图库详解
2021/07/07 Python