Node-Express框架

1. 概述

  1. 原生的 http系统模块 在某些方面表现不足以应对我们的开发需求
  2. 所以我们就需要使用框架来加快我们的开发效率
  3. 框架的目的就是提高效率,让我们的代码更高度统一(每个人的原生代码写法都不一样)
  4. Node 中,有很多 Web 开发框架, 我们这里以学习 Express 为主
  5. Express模块官网:http://expressjs.com

2. Express框架安装

  1. 在项目路径下
     npm init -y // 生成 package.json 文件,有则无需重复生成
     npm install -S express // 下载 Express 模块 ,-S(--save)npm5以上可以省略
    

3. Express模块的使用步骤

  1. 页面中加载模块(引包)

     const express = require('express') 
    
  2. 创建服务器应用程序(web服务器对象),也就是原来的http.createServer

     const app = express()
    
  3. 静态服务(公开指定目录)

    // 方式一:(推荐)
        app.use('/public/',express.static('./public/')) 
    	// 当访问路径是以 /public/ 开头的时候,则去 ./public/ 这个目录中去找对应的文件
    
    // 方式二:
    	app.use(express.static('./public/')) 
    	// 当省略第一个参数的时候,访问的时候路径中需要省略 /public/ 的方式来 ./public/ 中找对应的文件
    
    // 方式三:
    	app.use('/abc/',express.static('./public/')) 
    	// 当访问路径是以 /abc/ 开头的时候,则 ./public/ 这个目录中去找对应的文件
    	// abc 是起的别名,访问路径开头是可以自定义的,访问的资源是固定的
    
  4. 处理客户端请求:

     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({}) 它接收一个对象作为参数,它会自动把对象转为字符串再发送给浏览器
    
  5. 绑定端口号,启动服务器

    app.listen(3000,() => {
        
    })    
    

4. 基本路由

  1. 什么是基本路由

    1. 基本路由是一个术语
    2. 由请求方法、请求路径、请求处理函数组成
    3. 请求方法有两种:`get()``post()`
    
  2. 路由模块的提取

    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 中间件的概述

  1. 中间件的本质就是一个请求处理方法,我们把用户从请求到响应的整个过程发到多个中间件中去处理,这样做的目的是提高代码的灵活性,动态可扩展的。
    在这里插入图片描述

5.2 应用程序级别中间件

  1. 万能匹配(不关心任何请求路径和请求方法):
    	app.use(function (req, res, next) {
    		console.log('Time', Date.now())
    		next()   
    	})
    	// 三个参数:req 请求对象
    	//			res 响应对象
    	//			next() 下一个被匹配的中间件
    
  2. 只要以 ‘/xxx/’ 开头的:
    	app.use('/a', function (req, res, next) {
    		console.log('Time', Date.now())
    		next()
    	})
    	// 三个参数:req 请求对象
    	//			res 响应对象
    	//			next() 下一个被匹配的中间件
    

5.3 路由级别中间件

  1. get:
    	app.get('/', function (req, res) {
    		res.send('Hello world')
    	})
    	// 三个参数:req 请求对象
    	//			res 响应对象
    
  2. post:
    	app.post('/', function (req, res) {
    		res.send('Hello world')
    	})
    	// 三个参数:req 请求对象
    	//			res 响应对象
    
  3. put:
    	app.put('/user', function (req, res) {
    		res.send('Hello world')
    	})
    	// 三个参数:req 请求对象
    	//			res 响应对象
    
  4. delete:
    	app.delete('/user', function (req, res) {
    		res.send('Hello world')
    	})
    	// 三个参数:req 请求对象
    	//			res 响应对象
    

5.4 错误处理中间件

  1. 错误处理中间件
    // 错误处理的中间件要写在最后面
    // 在前面的中间件的 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 内置的中间件

  1. express.static
  2. express.json
  3. express.urlencoded

5.6 第三方中间件

  1. 网址:http://expressjs.com/en/guide/using-middleware.html
  2. 比如:body-parsercompressioncookie-parsermorganresponse-timeserve-staticsession

6. 在Express中配置第三方包

6.1 在Express中配置art-template模板引擎

  1. 配置文档说明:https://aui.github.io/art-template/express/

  2. 安装:

     // 在当前项目目录下下载第三方包
     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
    
  3. 配置:

     app.engine('html', require('express-art-template'))
    // 第一个参数表示,当渲染 .html 后缀的文件的时候,使用art-template模板引擎
    // 可以以文件类型更改第一个参数
    
  4. 使用:

     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 请求体数据插件

  1. Express 中没有内置获取表单 POST 请求体的API,这里我们需要配置一个第三方包:body-parser

  2. 安装:

    npm install body-parser --save
    
  3. 配置:

    // 1. 引包:
     const bodyParser = require('body-parser')
    // 2. 接收以键值对 & 分隔的请求报文:
     app.use(bodyParser.urlencoded({extended:false}))
    // 3. 接收 json 类型的请求报文:
     app.use(bodyParser.json())  
    // 注意:body-parser 在入口文件中配置,而且要在挂载路由之前配置             
    
  4. 使用:配置完之后,则在 req 请求对象上会多出一个属性 body
    通过 req.body 可以获取 POST 请求体数据

  5. 注意:在浏览器地址栏输地址访问,都是以get方式提交,post提交一般是在表单中和Ajax

6.3 在Express中配置Cookie

  1. Express这个框架中,默认不支持 SessionCookie
  2. 但是我们可以使用第三方中间件:express-session 来解决
  3. 查看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 加密模块

  1. 用户在注册或者登陆的时候,为了安全起见,一般会给密码进行加密
  2. 加密是无法逆向破解的,安全性能比较高
  3. 这个就结束一个用于加密的第三方包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))
    
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值