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 相关文章推荐
js 编程笔记 无名函数
Jun 28 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
Apr 07 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
Apr 17 Javascript
jQuery中extend()和fn.extend()方法详解
Jun 03 Javascript
在Node.js中使用HTTP上传文件的方法
Jun 23 Javascript
javascript如何写热点图
Dec 08 Javascript
js发送短信倒计时的简单实现方法
Sep 08 Javascript
面试常见的js算法题
Mar 23 Javascript
jQuery制作input提示内容(兼容IE8以上)
Jul 05 jQuery
微信小程序实现原生步骤条
Jul 25 Javascript
使用Vue 自定义文件选择器组件的实例代码
Mar 04 Javascript
vue中 this.$set的使用详解
Nov 17 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长字符串定义方法
2012/07/12 PHP
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
页面中iframe相互传值传参
2009/12/13 Javascript
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
整理Javascript数组学习笔记
2015/11/29 Javascript
jQuery事件用法详解
2016/10/06 Javascript
ECMAScript6--解构
2017/03/30 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
python原始套接字编程示例分享
2014/02/21 Python
Python中用PIL库批量给图片加上序号的教程
2015/05/06 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
Python之Class&Object用法详解
2019/12/25 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
Python如何实现FTP功能
2020/05/28 Python
Python3爬虫关于识别点触点选验证码的实例讲解
2020/07/30 Python
Python如何telnet到网络设备
2021/02/18 Python
Farnell德国:电子元器件供应商
2018/07/10 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
美国名牌香水折扣网站:Hottperfume
2021/02/10 全球购物
介绍Java的内部类
2012/10/27 面试题
医学专业毕业生个人求职信
2013/12/25 职场文书
会计辞职信范文
2014/01/15 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python