Express框架笔记

引用
const express = require(‘express’) 引入express框架
const app =express() 创建网站服务器
send()
(1)send方法内部会检测响应内容的类型
(2)会自动设置http状态码 会帮我们自动设置响应的内容类型以及编码
中间件
可以针对同一个请求设置多个中间件,对同一个请求进行多次处理
中间件可以有多个,先定义的先进入(满足条件的情况下)可以调用next方法交给下一个中间件,直到遇到结束请求的中间件就over
app.use可以接收所有请求 app.use((req, res, next) => { 前面也可以指定地址开头的请求
next()
})
如果不调用next()方法,是不会继续往下面走的
res.status(404) 设置状态码
中间件应用

  1. 路由保护 客户端在访问需要登录的页面时 可以先使用中间件判断用户登录状态 用户如果未登录就直接res.send拦截请求 登录了就next放行
  2. 网站维护公告 在所有路由的最上面定义接受所有请求的中间件,直接res.send做出响应
  3. 自定义404页面 在所有路由的最后面进行响应 res.status(404).send(‘您访问的页面不存在’)
    错误处理中间件(就是一个集中处理错误的地方 )
    自定义同步代码抛错:throw new Error(‘错误消息’)
    异步代码抛错:next(new Error(‘错误消息’)),异步代码只能捕获同步代码出错,异步代码出错只能手动通过这种方式抛出去错误才能被错误处理中间件捕获到
    next里面加参数就可以触发错误处理中间件
    错误处理中间件跟普通中间件的区别是他可以有四个参数 (err, res ,req, next) res.status(500).send(err.message) 抛出错误信息
    异步函数错误捕获
    try {
    await User.find({xxx})
    }.catch(err) {next(err)}
    构建模块化路由
    const userRouter = express.Router()
    在这里插入图片描述
    获取请求参数
    get:req.query
    post:req.body
    post请求需要引入第三方包 body-parser
    然后app.use(bodyParse.urlencoded({extended:false})) 就可以使用req.body来获取post请求参数了
    extended:false 方法内部使用queryString模块处理请求 true就是第三方模块qs
    这里使用queryString就够了

app.get(’/index/:name/:age’, (req, res) => {
console.log(req.params) // { name: ‘zs’, age: 18 }
res.send(‘ok’)
}) - 参数个数不能多,不能少,否则匹配不上路由
静态资源访问
这个方法接收一个参数 为静态资源存放的目录
app.use(’/xxx’ (可加可不加,加了之后就指定一个虚拟路径), express.static(path.join(__dirname, ‘public’))) // 推荐用这种形式
找到了就返回资源路径 找不到就next到下一个中间件
模板引擎
在这里插入图片描述
我们这里使用express-art-template第三方模块,实际上内部也是基于art-template来实现的,只不过为了更好的支持express框架来做了一些额外的处理,语法还是art-template的,所以安装时需要装两个
// 指定用artTemplate模板引擎去解析.html后缀的模板
// 理论上来讲,是可以同时存在多个模板引擎的,但是一般情况下,项目里面只会用一个模板引擎
要设置三个基础命令
第一个参数 模板的后缀 第二个参数 使用的模板引擎
app.engine(‘html’, require(‘art-template’))
// 指定模板文件的根目录
第一个views是固定的 第二个是模板引擎存放的文件夹位置
app.set(‘views’, path.join(__dirname, ‘views’))
// 指定模板文件的默认后缀为html
app.set(‘view engine’, ‘html’)

res.render(‘index’, { name: ‘zs’, age: 18 }) 渲染模板
第一个参数是模板名 第二个参数是渲染到模板中的数据 {{使用}}

  1. 会自动去模板文件的根目录下查找名为index的模板文件
  2. 会自动拼接模板默认后缀名
  3. 会自动结合模板数据解析模板
  4. 会自动将模板引擎解析出来的最终HTML响应给客户端,所以我们不需要再调用res.send和res.end方法了
    app.locals.users=[{name:‘zs’,age:10}] 将变量设置到app.locals下 这个数据在所有的模板中都可以获取
    模板中的css等文件的路径是相对于地址中的请求路径的 在模板中外链资源要写绝对路径

return false 可以阻止表单的默认行为
jQuery里面的$(this).serializeArray()可以获取到用户输入到表单的值
密码加密
npm install bcryptjs 哈希密码加密安装
//getSalt方法生成一个数值作为参数 数值越大 字符串复杂度越高 默认是10
const salt = await bcrypt.genSalt();
//hash对密码进行加密 第一个参数要加密的密码 第二个随机字符串
const pass = await bcrypt.hash(‘123456’, salt);
密码比对 第一个参数是明文密码 第二个参数是加密后的密码 返回的是一个布尔值
await bcrypt.compare(password, user.password);

res.redirect 重定向
//删除session
req.session.destroy(function() {
//删除cookie
res.clearCookie(‘connect.sid’); //这个id是浏览器默认定义的名字 要去调试台找
//重定向到登录界面
res.redirect(’/admin/login’);
}
})
配置session的时候加上 saveUninitialized: false 当用户没有登录的时候不要保存cookie
还有cookie:{
maxAge:246060*1000//设置cookie的过期时间 定位是毫秒
}
joi验证
第三方模块 先下载 ex.message 简化错误信息
定义验证规则 const schema={
username:Joi.string().min(2).max(10).error(new Error(‘错误信息’))
}
//实施验证
Joi.validate{验证对象,验证规则}

数据分页
limit(2) 限制查询数量 传入每页显示的数据数量
skip(1) 跳过多少条数据 传入显示数据的开始位置 从零开始 比如我要查询第二条数据 就要传入1
页码对应的数据查询开始位置 (当前页-1)*每页显示的数据条数
生产环境 开发环境
设置系统环境变量 NODE_ENV 为development 在代码中调用process.env测试环境变量是否正确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值