Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Node.js作为中间层实现前后端分离

Node.js作为中间层实现前后端分离

作者头像
conanma
发布于 2022-01-05 10:49:19
发布于 2022-01-05 10:49:19
2.1K00
代码可运行
举报
文章被收录于专栏:正则正则
运行总次数:0
代码可运行

一、前后端不分离存在什么问题

之前做一个Python+django+jQuery项目时候,经常碰到很尴尬的问题,前后端想分离,却始终分不开,或者说是分的不彻底,前端代码的开发总是要依赖Python的环境,环境崩溃了或者缺个插件,项目起不来,前端看不到页面效果,没法开发。 如果硬生生的把前端代码从整个项目中拉出来,单独开发,那前后端开发完,还是需要合并代码联调,还是得合在一起解决问题,开发效率很低。 前后端俨然成了牛郎织女一般,断了连,连了断,强行拆开,也想偷偷幽会,捉急呀。

前后端如漆似胶.jpg

二、为什么要前后端分离

1、开发效率高

前端开发人员不用苦苦地配置各种后端环境,安装各种莫名的插件,摆脱对后端开发环境的依赖,一门心思写前端代码就好,后端开发人员也不用时不时的跑去帮着前端配环境。

2、职责清晰,找bug方便

以前有了bug,前端推后端,后端推前端,不知道该谁去该,前后端分离,是谁的问题就该谁去处理,处理问题方便很多,后期代码重构方便,做到了高可维护性。

三、怎么实现前后端分离

  • 前端:负责View和Controller层路由的分发
  • 后端:只负责Model层,业务和数据处理等

最近一段时间学习了Node.js和koa框架后,总的来说Node.js优点还是挺多的:

  • 都是js,前端熟悉的语言,学习成本低
  • 事件驱动,非阻塞I/O
  • 适合IO密集型业务

现在决定尝试一下用Node.js作为中间层,PHP写后端简单的接口,Node.js封装PHP接口,前端axois请求封装后的接口,将需要的数据返回到对应的view层页面,既解决了跨域问题(Node.js作为服务端,服务端没有跨域一说),同时又不需要配后端环境,只需要一个PHP接口。基本逻辑如下图所示:

Node.js作为中间层作用

对此做了一个点赞+1的Demo,逻辑不复杂,但达到了Node.js作为中间层实现前后端分离的目的。

Github:https://github.com/pengxiaohua/praise-by-koa

1、截图:

点赞+1截图

2、功能介绍
  • 用PHP+MySQL完成点赞接口,实现用户点击一次更新数据库点赞总数+1
  • 用koa2+ES6封装PHP点赞接口,并建立路由。
  • praise项目迁移进入koa2,通过index/index路由进行访问
  • 将用户点击事件通过axios连接到koa2点赞接口
  • 对用户连续点击事件进行稀释(或叫节流)
  • 基本测试:完成点赞接口的自动化测试(mocha)、点赞+1功能的自动化测试(karma)、真实页面的点击自动化测试(selenium-webdriver)
3、项目代码结构

为了适配更多浏览器,代码中和.es6后缀的文件同名的.js文件是babel转码后的es5文件,这里省掉了对应的.js文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
├── app.es6                        <-- node启动页面
├── config
│   ├── config.es6                 <-- 配置端口号、文件名
├── controller
│   ├── indexController.es6        <-- 创建路由
│   ├── initController.es6         <-- 分发路由
├── karma.conf.js                  <-- karma配置文件
├── models
│   ├── model.es6                  <-- 后端php接口的封装
├── public
│   ├── css
│   │   └── main.css               <-- css文件
│   └── js
│       ├── connect-api.es6        <-- axois连接koa点赞接口
│       ├── index.es6              <-- 点赞+1
│       ├── thumb.es6              <-- 实例化index.es6
├── server
│   ├── db.php
│   ├── get_count.php              <-- 获取当前点赞数原始php接口
│   └── post_count.php             <-- 点赞+1原始php接口
├── test
│   ├── e2e.js                     <-- 端对端自动化测试
│   ├── geckodriver                <-- 端对端自动化测试Firefox启动程序
│   ├── index.spec.js              <-- 点赞+1功能自动化测试
│   ├── server.es6                 <-- 点赞+1接口测试
└── views
    ├── index.html                 <-- 主页面
    └── layout.html                <-- 模板

server文件夹,存放的是php接口代码文件,为了方便查看放到了项目中,其实是可以任意放到其他地方,或者其他服务器上的,只需要给出后端接口地址就行。 models文件夹,存放的代码是ES6和koa对后端接口的封装 controller文件夹,存放的代码是对路由的处理 public文件夹,存放的代码是css和js views文件夹,存放的代码是模板文件和html主页 config文件夹,存放的是配置端口号和文件名的代码 test文件夹,存放的是测试代码

4、安装
① clone the repo
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git clone https://github.com/pengxiaohua/news-responsive-by-react.git
$ cd news-responsive-by-react
② Install dependencies
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ npm install
5、启动

此项目在XAMPP环境下运行的php接口和数据库,开启Apache服务器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
localhost:8080

MySQL数据库创建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
('localhost','root','','praise',3506)

数据库名praise,接口3506,表名praise_count,2个字段‘id’和‘count’,id默认值为1,count默认值为0 浏览器输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://localhost:8081/index/index
6、测试
① 点赞+1功能自动化测试(unit单元测试)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
karma start
② 点赞+1接口自动化测试(service测试)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd test
 mocha server.js
③端对端测试(UI测试)

使用的是 selenium-webdriver,安装浏览器启动程序这里选择的是Firefox启动程序geckodriver macos v0.18.0版本,下载解压后和测试文件e2e.js放在一个目录下,开始测试 开启2个终端窗口 一个开启服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
node app.js

另一个窗口测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd test
node e2e.js

四、总结:

Node.js作为中间层实现前后端分离后:

前端

前端

后端

浏览器

服务器

服务器

HTML+CSS+JavaScript

Node.js

PHP(或其他后端语言)

跑在浏览器上的JS

跑在服务器上的JS

服务层

CSS、JS加载运行

转发数据,串接服务

提供数据接口

DOM操作

路由设计,控制逻辑

维持数据稳定

公用模板、路由

渲染页面,体验优化

封装业务逻辑

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
暂无评论
推荐阅读
编辑精选文章
换一批
前后端分离架构:Web 实现前后端分离,前后端解耦
前后端分离已成为互联网项目开发的业界标准使用方式,通过 nginx + tomcat 的方式(也可以中间加一个 nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS 等等)打下坚实的基础。这个步骤是系统架构从猿进化成人的必经之路。
业余草
2021/12/06
2.5K0
前后端分离架构:Web 实现前后端分离,前后端解耦
爱奇艺 PC Web Node.js 中间层实践
爱奇艺作为中国最大的互联网视频综合门户,一直致力于给用户提供更好的使用体验及观影品质。PC主站作为爱奇艺的门户,日均覆盖用户达千万级别。随着公司业务的扩展及端上对项目更新迭代的频率越来越快,对接口的性能、响应时间、缓存策略、接口定制化等要求越来越高,需要对接的接口团队也越来越多,单纯的靠PC Web前端发送ajax请求去调用接口整合数据,会让前端的业务逻辑变得越来越复杂;同时对接团队越多也意味着会带来更多的沟通成本,不利于项目需求的快速开发迭代,而且前端调用接口属于外网调用,接口的响应时间相比内网调用会更长,导致页面渲染速度变慢,用户体验变差。
五月君
2019/09/25
2.7K0
爱奇艺 PC Web Node.js 中间层实践
前后端不分离到分离演变,优势,前后端接口联调,排错及优化
 核心思想是前端html页面通过ajax调用后端的restuful api接口并使用json数据进行交互。
iginkgo18
2020/12/07
2.7K0
前后端不分离到分离演变,优势,前后端接口联调,排错及优化
Node.js初探
首先,我想说:“很荣幸在经历了2个月的努力,第一个Node.js项目落地了”。整个项目做下来,还是算比较顺畅的。
前端迷
2018/12/05
3.8K0
Node.js初探
浅谈前后端分离(下篇)
上篇主要介绍一下前后端分离的一些优缺点,本篇主要介绍一下前后端分离的一些落地,不过在介绍之前,要先阐述一下在实施前后端分离时,要考虑到一些东西
lyb-geek
2022/03/10
1.2K0
浅谈前后端分离(下篇)
你真的懂前后端分离吗?
最近这一段时间由于Nodejs的逐渐成熟和日趋稳定,越来越多的公司中的前端团队开始尝试使用Nodejs来练一下手,尝一尝鲜。
用户1093975
2018/07/20
2K0
你真的懂前后端分离吗?
我对Node作为中间层的一些想法
在互联网诞生之初,网页还只是一个承载静态信息的载具,只能显示一些纯静态的文本和图片。这种静态页面不能读取后台数据库中的数据,是一个完全封闭的生态,我们姑且称这是 Web 发展的“青铜时代”。
出其东门
2021/09/27
8220
去哪儿网前后端分离实践(含 Node.js 应用实践)
第一种是项目分离,承载页面分离。他的特点是简单,快速,前端只关注浏览器方面,除浏览器端之外都是后端负责。当然缺点是沟通成本高,前期,前端需要使用 ng 或者代理工具调试,后期,还要把页面给到后端,并且新建一个对应的路由。这样来来回回,调试非常的复杂,一旦前后端同学涉及到跨部门,跨楼层合作,这些成本又会相应的增加。
五月君
2019/09/17
1.1K0
去哪儿网前后端分离实践(含 Node.js 应用实践)
实现前后端分离的心得
实现前后端分离的心得 对目前的web来说,前后端分离已经变得越来越流行了,越来越多的企业/网站都开始往这个方向靠拢。那么,为什么要选择前后端分离呢?前后端分离对实际开发有什么好处呢? 为什么选择前后端
嘿嘿嘿
2018/09/10
2.2K0
实现前后端分离的心得
flask搭建一个前后端分离的系统
我们通常说三端,pc端,android端和ios端。如果前后端不分离,相当是要做三套系统。如果前后端分离的话,可以共用一个后端,前端各自做自己的,不用管后端。
赵云龙龙
2020/03/26
2.7K0
flask搭建一个前后端分离的系统
nodejs作为中间层的实践「详细介绍」
nodejs的出现为前端行业带来了无限的可能性,让很多原来只负责客户端开发的同学也慢慢开始接触和使用服务器端技术.
睡魔的谎言
2021/01/16
2.1K0
进阶 | 17年B站前端做过哪些不为人知之事?
前端爱好者的知识盛宴 本期推文的作者为吴俊毅,哔哩哔哩的前端架构师。 如果有任何问题欢迎留言评论。 如果你觉得IMWeb有用,欢迎转发。 关注我,我是你的IMWeb。 下面由吴俊毅开讲! B站的前端之路 2017年已经过去了,总结一下B站的前端进阶之路。 过去的开发模式中,我们采用了以后端为主的 MVC 架构方式。 具体来说,每次项目评审后,前后端会先一起约定好接口,之后分别进行开发,开发完,前端需要把页面提供给后端,后端配置上数据,然后返回出来。正式基于这样的开发模式,导致了总工作量的增加,同时沟通
用户1097444
2022/06/29
3010
进阶 | 17年B站前端做过哪些不为人知之事?
前后端分离后的前端时代,使用前端技术能做哪些事?
什么是前后端分离,要区分前端和后端,需要有个明确的界限。一般,用户可以直接看到的东西,都是属于前端的范畴,除了前端之外都属于后端了。
一墨编程学习
2018/10/27
2.3K0
前后端分离原理
  前后端分离已成为互联网项目开发的业界标准使用方式,通过Nginx+Tomcat的方式(也可以中间加一个Node.js)有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础。这个步骤是系统架构从猿进化成人的必经之路。核心思想是前端HTML页面通过Ajax调用后端的restuful api接口并使用json数据进行交互。
Kevin_Zhang
2018/09/20
8.9K0
分布式之闲侃前后端分离的必要性
引言 由于近期前端抽不出资源,博主最近接手一个前端项目的代码维护工作。拿到手一看,一脸懵逼,和博主当年所学的jsp开发方式、利用ajax来请求数据的单页面开发方式完全不同。然而火坑已经跳下,只能硬着头皮啃,博主只能默默告诉自己:"冲冲冲,四驱战士在行动!" 博主勉强算是经历了前端开发的几个时期吧。本文以一种循序渐进的方法,讲前后端分离架构的必要性。不过不得不说一点,目前前后端分离架构的文章一搜一大把,博主毕竟不是专业搞前端的,如果文章有什么理解不到位的地方,请及时指出,不胜感激。 正文 以博主的资历,没有经
Java高级架构
2018/07/20
3830
苏宁的Node.js实践:不低于Java的渲染性能、安全稳定迭代快
苏宁的技术架构,由苏宁云、基础支撑、后台、中台和前台组成。苏宁云主要为业务开发提供云服务。基础支撑,包括数据连接协议、防火墙、日志、中间件、短信等。在苏宁云和基础支撑之上,业务开发分为前中后台。而 Web 前端,主要集中在前台上。包含 PC 端、移动 WAP 端等。
五月君
2019/08/20
1.2K0
苏宁的Node.js实践:不低于Java的渲染性能、安全稳定迭代快
Vue+tp6 php框架如何快速建立一个前后端分离项目
作者主要是写后端的,所以本文主要以后端的角度,讲如何使用Vue+Tp框架结合,快速打通一个前后端分离的项目部署,可以作为后端学习Vue的入门步骤,通过此教程,你可以学到在生产环境和本地环境中,vue+tp 等框架是如何结合以及部署的。
PHP开发工程师
2021/04/26
4.7K0
Vue+tp6 php框架如何快速建立一个前后端分离项目
前端有必要去学Node.js吗?
Node近两年已经成为前端知识栈必备技能之一。随便点开招聘网站找个岗位几乎都会要求会Node,更不用提一些高级岗位了。
前端达人
2019/07/17
2.4K0
前端有必要去学Node.js吗?
前后端分离及部署2
1. 一般来说,要实现前后端分离,前端就需要开启一个本地的服务器来运行自己的前端代码,以此来模拟真实的线上环境,并且,也是为了更好的开发。因为你在实际开发中,你不可能要求每一个前端都去搭建一个java(php)环境,并且在java环境下开发,这对于前端来说,学习成本太高了。但如果本地没有开启服务器的话,不仅无法模拟线上的环境,而且还面临到了跨域的问题,因为你如果写静态的html页面,直接在文件目录下打开的话,你是无法发出ajax请求的(浏览器跨域的限制),因此,你需要在本地运行一个服务器,可是又不想搭建陌生而庞大的java环境,怎么办法呢?nodejs正好解决了这个问题。在我们项目中,我们利用nodejs的express框架来开启一个本地的服务器,然后利用nodejs的一个http-proxy-middleware插件将客户端发往nodejs的请求转发给真正的服务器,让nodejs作为一个中间层。这样,前端就可以无忧无虑的开发了
Freedom123
2024/03/29
1610
前后端分离及部署2
前后端分离实践
最早从Web2.0 Ajax技术开始兴起,就有提前后端分离了。从Gmail的单页应用,到现在的单页应用层出不穷。
gglinux
2019/02/23
1.3K0
相关推荐
前后端分离架构:Web 实现前后端分离,前后端解耦
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验