问题背景:

前端通常会有两种架构,一种是无前后端分离的,前端为后端提供渲染模板,这种方式把前后端开发人员绑定到了一起,很不灵活;另一种是前后端分离,也是目前大多数公司在走的路线,通常会使用 node 提供一个中间层,使用 node 层和服务端进行交互。市面上主要有阿里的 egg.js 和百度的 yog2。我们目前采用 yog2,采用 yog2 后面临了两个问题,这两个问题直到今天被策底解决:

问题一:跨域,前端页面直接访问后端接口时,出现跨域问题;

问题二:404,由于前端 node 服务没有部署后端接口服务,访问接口时会 404;

下文的解决方案针对 yog2.

最初方案:

解决这两个问题,最初的方案是在每个 app 中实现了一个 proxy,这个 proxy 负责把访问后端的接口转发到后端服务上:

axios.get('/ns/proxy/sub/userInfo', { });

这样有以下几个缺点:

1、每个接口的path 需要这样写:/namespace/proxy/path,这样将导致请求后端接口时必须要通过 node 转发,但有些接口并不需要用 node 转发,平白无故浪费了流量,增加了 node 集群的负载,尤其对于千万级别的 pv,能节省一点算一点

2、每个模块中需要实现一层 proxy,而且不能保证每位同学都按照/namespace/proxy/path 这种方式进行接口请求,无疑会引入跨域和404问题;

3、这种方式给研发带来了额外处理的成本;

最终方案:

我一直在想这个问题该如何解决,想过在 axios 中做代理,使用 http 代理,后来今天突然开窍了,想到一种可以不增加研发成本的方法。解决这个问题的核心是能保证「不部署后端服务的前提下,使用开发机的域名可以正常访问后端服务,保证访问的方式只是域名的替换」,我举个例子:

这个接口 https://lefex.gitee.io/user/info 是部署在后端服务上的,在你的开发机 http://wsy.dev.com:8086/user/info上是不可能访问到这个接口的,因为在开发机上只有 node 的运行环境,压根没有部署后端服务。

到目前,核心解决一个问题:能够通过自己的开发机器正常访问后端服务,即可,也就是说,使用 https://lefex.gitee.io 可以访问某个接口,也可以使用开 发机 http://wsy.dev.com:8086 访问这个接口。只要解决这个问题,跨域和 404 问题就迎刃而解。

在使用 yog2 时,当访问一个页面的时候,需要把模块名带上:http://wsy.dev.com:8086/ndsuyan (这里的模块名是 ndsuyan),但是在接口访问时不能带这个模块名,才能达到我们的预期。为做到这个,我做了两件事:

第一:为保证不影响线上的逻辑,不增加研发额外的工作量,我新建了一个模块 nodeProxyDev,专门用来做代理,把请求转发到后端服务上;

第二:需要修改 yog-base 模块的 dispatcher.js,使它能够遇到后端的接口请求转发到 nodeProxyDev 这个模块中;

这里有个问题需要注意,如何才能够区分开路由是要到 node 模块的还是后端服务呢?

我采用的是模块名进行区分,因为 node 和后端服务的模块名不同,我把所有的 odp 模块映射成了路由,这样当请求后端接口时就会转发到nodeProxyDev 这个模块,进行代理。

到此其实已经解决了跨域与 404 问题,但有个问题需要整个前端研发团队注意,在写接口请求时同源的情况下不要写域名,否则就不能进行转发。也就是要这样写:

axios.get('/user/info', {})

而不是这样:

axios.get('https://lefex.gitee.io/user/info', {})

如何用

以上主要说了整个原理,防止出现问题后能够及时解决。使用也非常简单:

1、下载 nodeProxyDev 这个模块,把它部署到你的研发机器上就行;

2、如果是自己的研发机器,记得使用最新的 base;

总之,很少的改动即可解决 404 和跨域问题,做到真正的前后端分离,node 项目无需再申请后端环境。以上,是我能想到的,你们肯定会有一些好的想法, 欢迎讨论。

长按关注

素燕《前端小课》

帮助 10W 人入门并进阶前端

官网:https://lefex.gitee.ioand /

解决前端 node 环境跨域与404问题,yog2相关推荐

  1. vue加跨域代理静态文件404_解决vue本地环境跨域请求正常,版本打包后跨域代理不起作用,请求不到数据的方法——针对vue2.0...

    问题:在本地使用了proxyTable代理可以正常跨域请求后台数据,打包上传后就无法获得后台的json文件.查看了相关资料可以用nginx进行解决.还可以使用命名环境变量,请求的时候进行判断,话不多说 ...

  2. mac使用Charles(花瓶)软件做代理,解决前端开发ajax跨域问题仅需三步

    前端开发本地调试,ajax访问远程服务器资源,经常面临跨域问题. 下面通过本地代理的方式解决这个问题.(结尾附下载地址) 一.打开proxy-proxy settings,指定端口号,打开勾选开启ht ...

  3. 解决前端图片下载跨域问题

    使用base64方法解决图片跨域不能下载问题

  4. 本地跨域处理ajax,Node.js配合node-http-proxy解决本地开发ajax跨域问题

    情景: 前后端分离,本地前端开发调用接口会有跨域问题,一般有以下3种解决方法: 1. 后端接口打包到本地运行(缺点:每次后端更新都要去测试服下一个更新包,还要在本地搭建java运行环境,麻烦) 2. ...

  5. Vue Nginx反向代理配置 解决生产环境跨域

    Vue本地代理举例: module.exports = {publicPath: './',devServer: {proxy: {'/api': {target: 'https://movie.do ...

  6. Vue代理解决生产环境跨域问题

    当我们前端要调用跨域接口时,我们需要用代理解决跨域问题,比如Vue的代理配置proxy,但是当Vue项目打包成静态文件时,他的代理也就失灵了,因为代理的前提是本地必须有service,本章讲一下生产环 ...

  7. Vue代理解决生产环境跨域问题 部署必备干货

    当我们前端要调用跨域接口时,我们需要用代理解决跨域问题,比如Vue的代理配置proxy,但是当Vue项目打包成静态文件时,他的代理也就失灵了,因为代理的前提是本地必须有service,本章讲一下生产环 ...

  8. 十秒解决开发环境跨域问题——取消浏览器同源策略

    解决开发环境跨域问题方法有很多,设置代理什么的略显繁琐:接下来介绍一个十秒解决开发环境跨域问题的方法--取消浏览器同源策,解决所有跨域问题,以谷歌浏览器为例. 一:Windows ①:关闭浏览器 ②: ...

  9. 新版vue-cli模板下本地开发环境使用node服务器跨域

    背景 我们都知道浏览器有一个既核心也最基本的安全功能,即同源策略.同源分别是:协议,域名,端口.如果浏览器访问服务器不同源的话,就会访问不到数据.那开发中常常访问的服务器不同源,那么可以借助一个服务器 ...

最新文章

  1. python高级数据结构_Python高级数据结构(二)
  2. 准确率precison与正确率accuracy区别
  3. JAVA程序设计----函数基础2
  4. 第八次ScrumMeeting博客
  5. JSON——入门语法、对象、数组
  6. Ehcache小结(一)
  7. css3之背景属性之background-size
  8. 电商后台、手机端、小程序、H5、电商原型、需求池、产品结构图、接口流程、高保真交互、PRD、布局说明、数据统计、店铺管理、商品管理、财务管理、售后、订单、会员、客服、标签、Axure原型、产品原型
  9. Android中如何提取和生成mp4文件
  10. 椒盐噪声加噪的实现原理
  11. MySQL数据库MyISAM与InnoDB存储引擎的比较
  12. C++ std :: fill()函数
  13. QTP自动化测试培训大纲
  14. amcharts php,amcharts实现动态数据介绍
  15. Mac自带的邮件 添加邮箱 无法验证账户或密码【已解决】
  16. 20145240 《信息安全系统设计基础》第六周同学问题总结
  17. 2017算法实习生应聘经验总结
  18. 使用spark TF-IDF特征计算文章间相似度
  19. 三国人物论—44—吕蒙
  20. 阻止事件冒泡 -- 在antd-mobile中,拦截点击picker后默认打开行为

热门文章

  1. Winform下CefSharp的引用、配置、实例与报错排除(源码)
  2. 报错解决:json.decoder.JSONDecodeError:
  3. MySQL高可用之MHA架构企业实战
  4. ROS安装使用与Qt使用ROS配置
  5. matlab怎么恢复默认字体,如何还原默认的注册表字体设置,我想恢复默认字体显示设置。...
  6. 怎么报考华为认证hcip?
  7. 关于三只母鸡和三只小鸡过河问题
  8. Android 10 系统 CPU 核数、频率、策略控制
  9. 一招解决vue中Module not found Error Can‘t resolve ‘xxx‘
  10. 一文了解什么是SOME/IP协议(超详细)