1. 概述
- 原生的
http系统模块
在某些方面表现不足以应对我们的开发需求 - 所以我们就需要使用框架来加快我们的开发效率
- 框架的目的就是提高效率,让我们的代码更高度统一(每个人的原生代码写法都不一样)
- 在
Node
中,有很多 Web 开发框架, 我们这里以学习Express
为主 - Express模块官网:http://expressjs.com
2. Express
框架安装
- 在项目路径下
npm init -y // 生成 package.json 文件,有则无需重复生成 npm install -S express // 下载 Express 模块 ,-S(--save)npm5以上可以省略
3. Express
模块的使用步骤
-
页面中加载模块(引包)
const express = require('express')
-
创建服务器应用程序(web服务器对象),也就是原来的
http.createServer
const app = express()
-
静态服务(公开指定目录)
// 方式一:(推荐) app.use('/public/',express.static('./public/')) // 当访问路径是以 /public/ 开头的时候,则去 ./public/ 这个目录中去找对应的文件 // 方式二: app.use(express.static('./public/')) // 当省略第一个参数的时候,访问的时候路径中需要省略 /public/ 的方式来 ./public/ 中找对应的文件 // 方式三: app.use('/abc/',express.static('./public/')) // 当访问路径是以 /abc/ 开头的时候,则 ./public/ 这个目录中去找对应的文件 // abc 是起的别名,访问路径开头是可以自定义的,访问的资源是固定的
-
处理客户端请求:
app.get('/',(req, res) => { res.send('回应内容') // 注:响应方法可以是使用send()和之前的end()或者是配置了模板引擎之后的render() }) //====================================================================================== A. 针对不同的请求,写多个 get() 就可以了 B. get 里面不会出现中文乱码问题,已经封装处理了 C. 当出现服务端没有的路径的时候,会自动用内置的404处理 D. 获取get提交方式的查询字符串对象:req.query E. 获取post提交方式的查询字符串对象:req.body(前提是配置了body-parser 第三方模块) F. 重定向方法:res.redirect('/'); 功能:重定向、结束响应,服务端重定向只针对同步请求才有效,异步请求无效, 异步请求想要重定向跳转只能在客户端(浏览器)里面做.如:window.location.href = '/' G. 改状态码:res.status(500) E. Express 提供了一个响应方法:res.json({}) 它接收一个对象作为参数,它会自动把对象转为字符串再发送给浏览器
-
绑定端口号,启动服务器
app.listen(3000,() => { })
4. 基本路由
-
什么是基本路由
1. 基本路由是一个术语 2. 由请求方法、请求路径、请求处理函数组成 3. 请求方法有两种:`get()`、`post()`
-
路由模块的提取
1. 为了实现模块功能单一,代码分离好维护,所以把路由功能单独放在一个模块 // 1. 创建一个路由模块:router.js 文件 // 2. 引入 express 包: const express = require('express') // 3. 创建路由容器: const router = express.Router() // 4. 把路由都挂载到路由容器中: router.get('/', function (req, res) {}) router.post('/', function (req, res) {}) // 5. 导出路由容器: module.exports = router // 6. 在入口模块中导入路由容器: const router = require('./router.js') // 7. 把路由容器挂载到服务端对象服务中: app.use(router)
5. EXpress
中间件
5.1 中间件的概述
- 中间件的本质就是一个请求处理方法,我们把用户从请求到响应的整个过程发到多个中间件中去处理,这样做的目的是提高代码的灵活性,动态可扩展的。
5.2 应用程序级别中间件
- 万能匹配(不关心任何请求路径和请求方法):
app.use(function (req, res, next) { console.log('Time', Date.now()) next() }) // 三个参数:req 请求对象 // res 响应对象 // next() 下一个被匹配的中间件
- 只要以 ‘/xxx/’ 开头的:
app.use('/a', function (req, res, next) { console.log('Time', Date.now()) next() }) // 三个参数:req 请求对象 // res 响应对象 // next() 下一个被匹配的中间件
5.3 路由级别中间件
- get:
app.get('/', function (req, res) { res.send('Hello world') }) // 三个参数:req 请求对象 // res 响应对象
- post:
app.post('/', function (req, res) { res.send('Hello world') }) // 三个参数:req 请求对象 // res 响应对象
- put:
app.put('/user', function (req, res) { res.send('Hello world') }) // 三个参数:req 请求对象 // res 响应对象
- delete:
app.delete('/user', function (req, res) { res.send('Hello world') }) // 三个参数:req 请求对象 // res 响应对象
5.4 错误处理中间件
- 错误处理中间件
// 错误处理的中间件要写在最后面 // 在前面的中间件的 err 处理:next(err) 这样就会直接进入错误处理的中间件 // 配置错误处理中间件的好处是,不用每个中间件都去处理错误了,把错误处理放在一个中间件中 app.use(function(err, req, res, next) { console.log(err.stack) res.status(500).send('Something broke!') }) // 参数: err 错误对象 // req 请求对象 // res 响应对象 // next 下一个匹配的中间件
5.5 内置的中间件
express.static
express.json
express.urlencoded
5.6 第三方中间件
- 网址:http://expressjs.com/en/guide/using-middleware.html
- 比如:
body-parser
、compression
,cookie-parser
、morgan
、response-time
、serve-static
、session
6. 在Express
中配置第三方包
6.1 在Express
中配置art-template
模板引擎
-
安装:
// 在当前项目目录下下载第三方包 npm install --save art-template npm install --save express-art-template // express-art-template 是专门用来在Express中把 art-template 整合到Express中的 // 下载 art-template 是因为 express-art-template 依赖了 art-template
-
配置:
app.engine('html', require('express-art-template')) // 第一个参数表示,当渲染 .html 后缀的文件的时候,使用art-template模板引擎 // 可以以文件类型更改第一个参数
-
使用:
res.render('html模板文件',{模板数据}) //=============================================================================== A. Express 为 Response 响应对象提供了一个方法 render(),此方法默认不可以使用,但是如果配置了模板引擎就可以使用了。 B. render() 方法的作用为读取文件、渲染文件、响应给客户端、结束响应。 C. render('html文件') 方法只写前面一个参数也可以,功能为:读取文件、响应给客户端 D. Express 有一个约定:开发人员把所有的视图文件都放到 views 目录中。所以 views 是 render 方法第一个参数的默认路径 第一个参数不用写 views,直接写文件名就可以了,默认会去 views 中找 E. 如果想要更改 render() 方法的第一个参数的默认路径:app.set('views','新的默认路径')
6.2 在Express
中配置获取 post
请求体数据插件
-
在
Express
中没有内置获取表单 POST 请求体的API
,这里我们需要配置一个第三方包:body-parser
-
安装:
npm install body-parser --save
-
配置:
// 1. 引包: const bodyParser = require('body-parser') // 2. 接收以键值对 & 分隔的请求报文: app.use(bodyParser.urlencoded({extended:false})) // 3. 接收 json 类型的请求报文: app.use(bodyParser.json()) // 注意:body-parser 在入口文件中配置,而且要在挂载路由之前配置
-
使用:配置完之后,则在 req 请求对象上会多出一个属性 body
通过req.body
可以获取 POST 请求体数据 -
注意:在浏览器地址栏输地址访问,都是以
get
方式提交,post
提交一般是在表单中和Ajax
6.3 在Express
中配置Cookie
- 在
Express
这个框架中,默认不支持Session
和Cookie
- 但是我们可以使用第三方中间件:
express-session
来解决 - 查看cookie的浏览器插件:
EditThisCookie Chrome
// 1. 安装 express-session 中间件 npm install express-session --save // 2. 引包 const session = require('express-session') // 3. 配置 (要在挂载路由之前) app.use(session({ secret: 'keyboard cat', // 配置加密字符串,在原来的加密基础之上,拼接这里的自定义字符串,增加安全性 resave: false, saveUninitialized: true // 无论使不使用 session 存数据,都会默认分配一把钥匙。 // 如果设置为 false, 只有使用 session 存数据,才会分配钥匙 })) // 4. 使用:在处理请求的路由中,通过 req.session 来访问和设置 Session 成员 req.session.key = 'value' // 添加数据:key为之定义的属性名,value为要添加的属性值 req.session.key // 访问数据:在添加了数据的前提下,可以通过属性名访问到添加的数据 req.session.key = null // 删除 Session // ==================================================================================================== // 5. 注意:默认 Session 数据是内存存储,服务器一旦重启就会丢失,真正的生产环境会把 Session 进行持久化存储
7. blueimp-md5
加密模块
- 用户在注册或者登陆的时候,为了安全起见,一般会给
密码进行加密
- 加密是无法逆向破解的,安全性能比较高
- 这个就结束一个用于加密的第三方包
blueimp-md5
// 1. 安装包 npm install blueimp-md5 --save // 2. 引包(在哪个页面使用就在哪个页面引入) const md5 = require('blueimp-md5') // 3. 使用(比如:) req.body.password = md5(req.body.password) // 可以进行多次加密 req.body.password = md5(md5(req.body.password))