Express-及中间件的简单理解
Express
Express 是一个基于node平台,保持最小规模的灵活的 Node.js Web 应用程序开发框架,在Node.js基础上扩展对了web应用开发所需要的基础功能为 Web 和移动应用程序提供一组强大的功能。
首先安装express:
cnpm install express -g
其次:通过express-generator可以快速的帮我们搭建一个应用的骨架。
npm install express-generator -g
输入命令:express -e,搭建骨架。
//引入模块
const express = require('express');
//app:express的返回值,express的实例
const app = express()
//get请求
app.get('/', (req, res) => res.send('Hello World!')) //发送一个helloword
app.listen(3000)
Express使得我们开发Web应用更加快捷、方便。
举一个例子:
用node.js在控制台打印出一个"你好"。
var http = require("http");
http.creatServer((req,res)=>{
console.log("你好");
}).listen(6666);
这样,当我们处理各种数据传送请求时,需要将所有请求的处理代码写在creatSercer包裹的函数里。
而用Express实现在控制台打印出一个"你好"。
var express = require("express");
var http = require("http");
var app = express();
http.creatServer(app);
//处理用户请求(路由)
app.get("/",()=>{
console.log("你好");
})
Express处理各种数据传送请求是通过Express执行函数去调用对应的方法,其实也是执行express()后,会返回一个函数,赋值给app,app就是express,然后请求都会被app这个函数所处理,可以这样认为,在express内部,有一个函数的数组,每一次来一个请求,express内部就会执行这个数组中满足条件的函数,而app.ues就是用来使用中间件的。
中间件
说到中间件,官网对他的阐述是这样的:
“Express是一个自身功能极简,完全是路由和中间件构成一个web开发框架:从本质上来说,一个Express应用就是在调用各种中间件”。由此可见中间件在Express开发中的重要性,可能官网所说的比较官方,那么来举个例子:
可以想象一下我们租房时遇到的房产中介,他会给我们提供一些信息,他所处的角色是介于房主与我们之间,他的作用就是会带我们看房等我所请求的要求,而他的作用,就相当于中间件的作用,就相当于服务器的请求和回复之间,租客和房东之间。
简单来说,由于在用node api进行http请求的处理时要求引入很多的模块,类似于url模块、fs模块等等,并且在对http请求做处理时需要很多重复但不是逻辑上的操作,所以就会出现已经帮你封装好的中间件,让你不再耗费时间在数据处理和异常处理上,这样可以大大减少代码量,逻辑更清晰,具有便捷高效的扩展性。
而中间件主要解决了什么问题呢?
它主要是拓展了一些res、req的方法。这些方法可以去帮我们解决一些复杂的,需要自己去解决的问题。因此我就来总结一下中间件。
一、中间件的结构
app.use([path],function)
path:是路由的url,默认参数为"/",意义是路由到这个路径是使用这个中间件,这个参数为需要的时候写不需要的时候可以不写。
function:中间件函数,这个函数可以理解为:function(req,res,next)
自上面的结构中,我们了解了中间件使用时的第二个参数是一个函数,而这个函数拥有三个参数(req,res,next);那么下面我们了来说一下这三个参数的作用。
当每个请求到达服务器时,nodejs会为了某个请求而去创建一个请求对象(req),该请求对象包含客户端提交上来的数据,同时也会创建一个响应对象(res),响应对象主要负责将服务器的数据响应到客户端。
而最后一个参数next是一个方法,因为开发一个项目需要使用到多个中间件,而想要运行下一个中间件,那么上一个中间件必须运行next(),如果没有调用next()的话,就不会调用下一个函数了,也就是说调用会被终止,再一次来举个栗子:
app.use((req,res,next)=>{
console.log('111');
next();
console.log('222');
})
app.use((req,res,next)=>{
console.log('333');
next();
});
控制台输出的顺序为:111 333 222
二、中间件的分类
1、内置的中间件
express.static 是Express目前唯一的内置中间件,它基于serve-static,用来处理静态资源文件,它有两个参数,参数root是指提供静态资源的根目录,可选的options参数拥有如下属性。
2、第三方中间件
Express是一款提供路由和中间件的Web框架,但其本身的功能却异常精简,Express应用的功能通过第三方中间件来添加。
有关第三方中间件,分析几个比较重要和常用的。
body-parser:解析body中的数据,并将其保存为Request对象的body属性。
cookie-parser:解析body中的数据,并将其保存为Request对象的cookie属性。
express-session:解析服务端生成的sessionid对应的session数据,并将其保存为Request对象的session属性。
query:这个中间件,将一个查询字符串从URL转换为JS对象,并将其保存为Request对象的query属性。
如果这样不好理解的话,中间件也可以这样分为三大类:
1>pre-request —— 通常用来该项reques的原始数据
2>reqest(请求)、response(响应) —— 大部分中间件都在这里,为req、res的拓展方法,功能各异。
3>post-response —— 全局异常处理,改写response数据等。
三、中间件的理解
最后,我们再来分析一下从浏览器地址栏输如url到客户端显示数据之间这个过程到底发生了什么。
浏览器向服务器发送了一个请求后,服务器首先收到req的数据请求,然后服务端进行处理,处理完了之后发送res响应回去,这中间就一定有一个函数将这些数据做了处理,这个处理数据的函数,就是中间件,而中间件执行的顺序就是你定义的顺序。由此可见,中间件可以这么理解:
1、封装了一些处理一个完整事件的功能函数。
2、非内置的中间件需要通过安装后,req到文件就可以运行。
3、封装了一些复杂但肯定通用的功能。
Express-及中间件的简单理解的更多相关文章
- express之中间件bodyParser的理解
bodyParser用于解析客户端请求的body中的内容,内部使用JSON编码处理,url编码处理以及对于文件的上传处理.另外bodyParse也可以接受客户端ajax提交的json数据,以及url的 ...
- express 中间件的简单应用与实现
express 中间件的简单应用与实现 看了慕课网双越老师的课之后结合自己的理解做了一些简单的总结,如有不恰当之处,欢迎指正. 提到 express 就不得不提到中间件,接下来就简单的介绍一下 exp ...
- 77.深入理解nodejs中Express的中间件
转自:https://blog.csdn.net/huang100qi/article/details/80220012 Express是一个基于Node.js平台的web应用开发框架,在Node.j ...
- Express static 托管静态文件 理解
今天偶尔看了一下服务端渲染,遇到了express.static, 在以前学习webpack配置服务端渲染时,也使用express.static 中间件,两者配置不太一样,由于当时也没有认真学,所以 一 ...
- 简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析
简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析 虽然经常用 OAuth 2.0,但是原理却不曾了解,印象里觉得很简单,请求跳来跳去,今天看完相关介绍,就来捋一捋 ...
- 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制
[原创]分布式之数据库和缓存双写一致性方案解析(三) 正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...
- 单页面应用的History路由模式express后端中间件配合
这篇文章主要分享一下通过HTML5的history API的时候,使用NodeJS后端应该如何配置,来避免产生404的问题,这里是使用的express的框架,主要是通过connect-history- ...
- git的简单理解及基础操作命令
前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
随机推荐
- 64. Minimum Path Sum (Graph; DP)
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- static变量和static函数
在C语言编程中,static的一个作用是信息屏蔽! 比方说,你自己定义了一个文件 -- 该文件中有一系列的函数以及变量的声明和定义! 你希望该文件中的一些函数和变量只能被该文件中的函数使用,那么,你可 ...
- 使用类加载器加载配置文件/getClassLoader().getResourceAsStream()
加载配置文件的两种方式; 1. 2. 两者相比,第一种方式更为方便,因为文件目录发生改变就会找不到.
- 2016-2017-20155329 《Java程序设计》第6周学习总结
学号 2016-2017-20155329 <Java程序设计>第6周学习总结 教材学习内容总结 数据从来源取出:输入串流 java.io.InputStream 写入目的的:输出串流 j ...
- ADO.net开放式并发
https://docs.microsoft.com/zh-cn/dotnet/framework/data/adonet/optimistic-concurrency 在多用户环境中,有两种用于更新 ...
- UVa 12093 Protecting Zonk (树形DP)
题意:给定一个有n个节点的无根树,有两种装置A和B,每种都有无限多个.在某个节点X使用A装置需要C1的花费,并且此时与节点X相连的边都被覆盖.在某个节点X使用B装置需要C2的花费,并且此时与节点X相连 ...
- Robotframework-Appium 之常用API(一)
上一遍隨筆(https://www.cnblogs.com/cnkemi/p/9639809.html)用Python + Robotframework + Appium對Android app小試牛 ...
- java并发编程实战:第十一章----性能和可伸缩性
线程的最主要目的是提高程序的运行性能,但性能的提升会导致复杂性的提升,又会导致安全性和活跃性的风险 一.对性能的思考 提升性能意味着用更少的资源做更多地事情.要想通过并发来获得更好的性能,就要更有效地 ...
- B-spline Curves 学习之B样条曲线性质(5)
B-spline Curves: Important Properties 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. ...
- scala中Nil用法
http://www.runoob.com/scala/scala-lists.html 即Nil是空List 双冒号是追加进入 package com.yjsj.spark object scala ...