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压缩工具:X2JSCompactor
Jun 13 Javascript
一个js封装的不错的选项卡效果代码
Feb 15 Javascript
文本框输入时 实现自动提示(像百度、google一样)
Apr 05 Javascript
html的DOM中document对象forms集合用法实例
Jan 21 Javascript
javascript中tostring()和valueof()的用法及两者的区别
Nov 16 Javascript
Bootstrap模态对话框的简单使用
Apr 29 Javascript
学习使用jQuery表单验证插件和日历插件
Feb 13 Javascript
vue路由拦截及页面跳转的设置方法
May 24 Javascript
Node.js console控制台简单用法分析
Jan 04 Javascript
如何在Angular应用中创建包含组件方法示例
Mar 23 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
Jul 30 Javascript
小程序实现筛子抽奖
May 26 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
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
php 中文处理函数集合
2008/08/27 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
js点击button按钮跳转到另一个新页面
2014/10/10 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
探索JavaScript中私有成员的相关知识
2019/06/13 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
python为tornado添加recaptcha验证码功能
2014/02/26 Python
深入Python函数编程的一些特性
2015/04/13 Python
深入解析Python中函数的参数与作用域
2016/03/20 Python
Python+pandas计算数据相关系数的实例
2018/07/03 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
2019/08/16 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
Python3的socket使用方法详解
2020/02/18 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
canvas使用注意点总结
2013/07/19 HTML / CSS
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
为什么使用接口?
2014/08/13 面试题
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
30岁生日感言
2014/01/25 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
结婚堵门保证书
2015/05/08 职场文书
加强党性修养心得体会
2016/01/21 职场文书
高效课堂教学反思
2016/02/24 职场文书
MySQL中一条update语句是如何执行的
2022/03/16 MySQL
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技