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实例教程(19) 使用HoTMetal(6)
Dec 23 Javascript
JS的千分位算法实现思路
Jul 31 Javascript
JSON+HTML实现国家省市联动选择效果
May 18 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
Apr 12 Javascript
Bootstrap开发实战之响应式轮播图
Jun 02 Javascript
原生js仿淘宝网商品放大镜效果
Feb 28 Javascript
vue实现点击图片放大效果
Aug 15 Javascript
详解如何用模块化的方式写vuejs
Dec 16 Javascript
vue实现文章内容过长点击阅读全文功能的实例
Dec 28 Javascript
微信小程序之 catalog 切换实现解析
Sep 12 Javascript
VUE兄弟组件传值操作实例分析
Oct 26 Javascript
浅谈vue在html中出现{{}}的原因及解决方式
Nov 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实现博客,论坛图片防盗链的方法
2016/10/15 PHP
JQUERY 浏览器判断实现函数
2009/08/20 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
Python实现将数据库一键导出为Excel表格的实例
2016/12/30 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
Python unittest单元测试框架总结
2018/09/08 Python
python得到windows自启动列表的方法
2018/10/14 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
python生成大写32位uuid代码
2020/03/03 Python
pandas数据拼接的实现示例
2020/04/16 Python
python 画图 图例自由定义方式
2020/04/17 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
opencv实现图像几何变换
2021/03/24 Python
财务分析个人的自荐书范文
2013/11/24 职场文书
小学生通知书评语
2014/12/31 职场文书
国庆节主题班会
2015/08/15 职场文书
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript