Loading...
墨滴

百事可乐。

2021/12/01  阅读:41  主题:蓝莹

Node.js篇-2. Express框架

Express框架 Express框架简介及初体验 Express框架是什么 Express是一个基于Node平台的Web应用开发程序,它提供了一系列强大特性,帮助你创建各种web应用 我们可以使用 npm install express 命令进行下载 Express框架特性

  • 提供了方便简洁的路由定义方式
  • 对获取HTTP请求参数进行了简化处理
  • 对模板引擎支持程度高,方便渲染动态HTML页面
  • 提供了中间件机制有效控制HTTP请求
  • 拥有大量第三方中间件对功能进行扩展 中间件 什么是中间件 中间件就是一堆方法,可以接收客户端发来的请求,可以对请求做出响应,也可以将请求继续交给下一个中间件继续处理

中间件主要由两部分组成: 中间件方法以及请求处理函数 中间件方法由Express提供,负责拦截请求,请求处理函数由开发人员提供,负责处理请求 app.get('请求路径','处理函数') //接收并处理get请求 app.post('请求路径','处理函数') //接收并处理post请求

可以针对同一个请求设置多个中间件,对同一个请求进行多次处理 默认情况下,请求从上到下依次匹配中间件,一旦匹配成功,终止匹配 可以调用next()方法将请求的控制权交给下一个中间件,直到结束请求的中间件 app.get('/request',(req, res, next) => { req.name = '张三'; next(); }); app.get('/request',(req, res) => { res.send(req.name); });

app.use中间件用法 app.ues 匹配所有的请求方式,可以直接传入请求处理函数,代表接收所有的请求 app.use((req, res, next) => { console.log(req.url); next(); });

app.use 第一个参数也可以传入请求地址,代表不论什么请求方式,只要是这个请求地址就接收这个请求 app.use('/admin', (req, res, next) => { console.log(req.url); next();
});

中间件应用

  1. 路由保护,客户端在访问需要登录的页面时,可以先使用中间件判断用户登录状态,用户如果未登录,则拦截请求,直接响应,禁止用户进入需要登录的界面
  2. 网站维护公告,在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应,网站正在维护中
  3. 自定义404页面 错误处理中间件 在程序执行的过程中,不可避免的会出现一些无法预料的错误,比如文件读取失败,数据库连接失败 错误处理中间件是一个集中处理错误的地方 app.get('/index',(req, res) => { throw new Error(); }) // 错误中间件 app.use((err, req, res, next) => { res.status(500),send(err); });

当程序出现错误时,调用next()方法,并且将错误信息通过参数的形式传递给next()方法,即可触发错误处理中间件 app.get('/路径',(req, res) => { fs.readFile('路径', 'utf8', (err, result) => { if (err != null) { // 触发错误处理中间件 next(err); } else { res.send(result); } }) }) // 错误处理中间件 app.use((err, req, res, next) => { res.status(500),send(err); });

捕获错误 在node.js中,异步API的错误信息都是通过回调函数获取的,支持Promise对象的异步API发生错误可以通过catch方法捕获 Try catch 可以捕获异步函数以及其他同步代码在执行过程中发生的错误,但是不能捕获其他类型API发生的错误 // 增加代码健壮性 app.get('/', async (req, res, next) => { try { await User.find({name: '张三'}); } catch(ex) { // 触发错误处理中间件 next(ex); } });

Express请求处理 构建模块化路由 基础代码 : const express = require('express') // 创建路由对象 const home = express.Router(); // 将路由和请求路径进行匹配 app.use('home',home); // 在home路由下继续创建路由 home.get('/index', (req, res) => { // /home/index res.send('欢迎来到博客展示页面'); });

模块化路由: // home.js const home = express.Router(); home.get('/index', (req, res) => { res.send('欢迎来到展示页面'); }) module.exports = home;

// admin.js const admin = express.Router(); admin.get('/index', (req, res) => { res.send('欢迎来到管理页面'); }) module.exports = admin;

// app.js const home = require('./home.js'); const admin = require('./admin.js');

app.use('/home', home); app.use('/admin', admin);

GET参数的获取 Express框架中使用req.query即可获取GET参数,框架内部会将GET参数转换为对象并返回 // 接收地址栏中问好后面的参数 // 例如: http://localhost:3000/?name=zhangsan&age=20 app.get('/', (req, res) => { console.log(req.query) // {name: 'zhangsan', age: '20'} });

POST参数的获取 Express中接收post请求参数需要借助第三方包body-parser // 引入body-parser模块 const bodyParser = require('body-parser'); // 配置body-parser模块 // extended: false 方法内部使用querystring模块处理请求参数的格式 // extended: true方法内部使用qs第三方模块处理请求参数的格式 app.use(bodyParser.urlencoded({ extend: false })); // 接收请求 app.post('/add', (req, res) => { // 接收请求参数 console.log(req.body); })

Express路由参数 // 请求当前路由要传一个id参数 // localhost:3000/find/123 app.get('/find/:id', (req,res) => {

});

静态资源的处理 通过Express内置的express.static可以方便的托管静态文件,例如img,css,JavaScript文件等 app.use(express.static('路径'));

express-art-template模板引擎 模板引擎

  • 为了使art-template模板引擎能够更好地和Express框架配合,模板引擎官方在原art-template模板引擎的基础上封装了Express-art-template
  • 使用npm install art-template express-art-template命令进行安装 // 渲染后缀为art的模板时,使用express-art-template app.engine('art', require('express-art-template')); // 设置模板存放目录 app.set('views', path.join(__dir,'views')); // 渲染模板时不写后缀,默认拼接art后缀 app.set('view engine', 'art'); app.get('/', (req, res) => { // 渲染模板 // render方法做了四件事 // 1. 拼接模板路径 // 2. 拼接模板后缀 // 3. 哪一个模板和哪一个数据进行拼接 // 4. 将拼接结果响应给客户端 res.render('模板名字,可以省略.art', { msg: 'message' }); });

app.locals对象 将变量设置到app.locals对象下面,这个数据在所有的模板中都可以获取到 app.locals.users = [{ name: '张三', age: 20 }, { name: '李四', age: 30
}]

项目环境搭建 项目介绍 多人博客管理系统

  1. 博客内容展示
  2. 博客管理功能 案例初始化
  3. 建立项目所需文件夹
  • public 静态资源
  • model 数据库操作
  • route 路由
  • Views 模板
  1. 初始化项目描述文件
  • Npm init -y
  1. 下载项目所需第三方模块
  • Npm install express mongoose art-template express-art-template
  1. 创建网站服务器
    密码加密 bcrypt 哈希密码是单程加密方式: 1234 => abcd 在加密的密码中加入随机字符串可以增加密码被破解的难度 // 导入bcrypt模块 const bcrypt = require('bcrypt'); // 生成随机字符串 gen => generate 生成salt盐 let salt = await bcrypt.genSalt(10); // 使用随机字符串对密码进行加密 let pass = await bcrypt.hash('明文密码', salt);

// 密码比对 let isEqual = await bcript.compare('明文密码','加密密码');

bcrypt依赖的其他环境

  1. python2.x
  2. node-gyp npm install -g node-gyp
  3. windows-build-tools npm install --global --production windows-build-tools cookie与session Cookie: 浏览器在电脑硬盘中开辟的一块空间,主要供服务器端存储数据
  • cookie中的数据是以域名的形式进行区分的
  • cookie中的数据是有过期时间的,超过时间数据会被浏览器自动删除
  • cookie中的数据会随着请求被自动发送到服务器端

Session: 实际上就是一个对象,存储在服务器端的内存中,在session对象中也可以存储多条数据,每一条数据都有一个sessionID做为唯一标识

在node,js中需要借助express-session实现session功能 const session = require('express-session'); app.use(session({ secret: 'secret key' }));

Joi JavaScript对象的规则描述语言和验证器 const Joi = require('Joi'); const schema = { username: Joi.string().alphanum().min(3).max(30).required().error(new Error('错误信息')), password: Joi.string().regex(/^[a-zA-Z0-9]{3-30}$/), access_token: [Joi.string(), Joi.number()], birthyear: Joi.number().integer().min(1900).max(2013), email: Joi.string.email() }; Joi.Validate({'验证对象'},schema); //返回Promise对象

数据分页 第一种方式: 当数据库中的数据非常多时,数据需要分批次显示,这时就需要用到数据分页功能

分页功能核心要素:

  1. 当前页,用户通过点击上一页或下一页或者页码产生,客户端通过get参数方式传递到服务器端
  2. 总页数,根据总页数判断当前页是否为最后一页,根据判断结果做响应操作

limit() // 限制查询数量 传入每页显示的数据数量 skip() // 跳过多少条数据 传入显示数据的开始位置

数据开始位置 = (当前页-1) * 每页显示数据条数 第二种方式 mongoose-sex-page const pagination = require('mongoose-sex-page'); // page当前页 size当前页显示数据数量 display指定客户端显示几个页码 exec向数据库发送查询请求 pagination(集合构造函数).page(1).size(20).display(0).exec();

Formidable 作用: 解析表单,支持get请求参数, post请求参数, 文件上传 // 引入表单模块 const formidable = require('formidable'); // 创建表单解析对象 const form = new formidable.IncomingForm(); // 设置文件上传路径 form.uploadDir('路径'); // 保留表单上传文件的扩展名 form.keppExtensions = true; // 对表单进行解析 form.parse(req, (err,fields,files) => { // fields存储普通请求参数 // files存储上传的文件信息 });

文件读取 FileReader const reader = new FileReader(); reader.readAsDataURL('文件'); reader.onload = function () { console.log(reader.result) };

mongoDB数据库添加账号

  1. 以系统管理员方式运行powershell
  2. 连接数据库 mongo
  3. 查看数据库Show dbs
  4. 切换到admin数据库 use admin
  5. 创建超级管理员账户 db.creatUser()
  6. 切换到blog数据库 use blog
  7. 创建普通账号 db.createUser()
  8. 卸载MongoDB服务
  9. 停止服务 net stop mongodb
  10. Mongodb --remove
  11. 创建MongoDB服务(一大堆)
  12. 启动MongoDB服务 net start mongodb
  13. 在项目中使用账号连接数据库 mongoose.connect('mongodb://user:pass@localhost:port/database') 开发环境与生产环境
  • 什么是开发环境与生产环境 环境,就是指项目运行的地方,当项目处于开发阶段,项目运行在开发人员的电脑上,项目所处的环境就是开发环境.当项目开发完成以后,要将项目放到真实的网站服务器电脑中运行,项目所处的环境就是生产环境
  • 为什么要区分开发环境与生产环境 因为在不同的环境中,项目的配置是不一样的,需要在项目代码中判断当前项目运行的环境,根据不同的环境应用不同的项目配置.
  • 如何区分开发环境与生产环境 通过电脑操作系统中的系统环境变量区分当前是开发环境还是生产环境

if (process.env.NODE_ENV == 'development') { // 开发环境 } else { // 生产环境 }

第三方模块config 作用:允许开发人员将不同运行环境下的应用配置信息抽离到单独的文件中,模块内部自动判断当前应用的运行环境,并读取对应的配置信息,极大提供应用配置信息的维护成本,避免了当运行环境重复的多次切换时,手动到项目代码中修改配置信息

  • 使用步骤
    1. Npm install config 命令下载模块
    2. 在项目根目录下新建config文件夹
    3. 在config文件夹下面新建default.json, development.josn, production.json文件
    4. 通过require方法导入模块
    5. 使用模块内部提供的get方法获取配置信息
  • 将敏感配置信息存储在环境变量中
    1. 在config文件夹中建立custom-environment-variables.json
    2. 配置项属性的值写系统环境变量的名字
    3. 项目运行时config模块查找系统环境变量,并读取其值作为当前配置项属于的值

百事可乐。

2021/12/01  阅读:41  主题:蓝莹

作者介绍

百事可乐。