1. 目标
- 开发一个博客系统
- 只开发server端
2. 需求
- 首页,作者主页,博客详情页
- 登录页
- 管理中心,新建页,编辑页
3. 技术方案
- 数据如何存储
- 博客 id title content createtime author
- 用户 id username password realname
- 如何与前端对接,即接口设计
- 获取博客列表 /api/blog/list get author作者,keyword搜索关键字
4. 搭建开发环境
- 从0搭建,不使用框架
- 使用nodemon检测文件变化,自动重启node
- 使用cross-en设置环境变量,兼容mac和window
5.开发接口
- 初始化路由:根据之前技术方案的设计,做出路由
- 返回假数据:将路由和数据处理分离
6. nodejs连接mysql
- 操作数据库
- 安装MySQL: brew install mysql
- 启动MySQL服务: brew services start mysql
- 停止MySQL服务: brew services stop mysql
- 重启MySQL服务: brew services restart mysql
- 查看MySQL服务状态: brew services list | grep mysql
- 进入MySQL命令行界面: mysql -u root -p
- 卸载MySQL: brew uninstall mysql
- 建库、建表
- 建表时常用数据类型(int、bigint、varchar、longtext)
- sql语句实现增删改查
7. api连接mysql
8. 登录
- 核心:登录校验、登录信息存储
- cookie、session
- session写入redis
- 开发登录功能,和前端链条(nginx方向代理)
9.cookie
- 什么是cookie 1.存储在浏览器的一段字符串 最大5kb 2.跨域不共享 3.每次发送http请求,会将请求域的cookie一起发送给cookie 4.server可以修改cookie并返回给浏览器 5.浏览器中也可以通过js修改cookie
- js操cookie 浏览器中查看cookie
- server端操作cookie 实现登录验证
10.server端nodejs操作cookie
- 查看cookie
- 修改cookie
- 实现登录验证
11.session
- 使用cookie 会暴露username
- 解决:cookie中存储userid,server端中对应username
- session,即server端存储用户信息
12.session的问题
- 目前session直接是js变量 放在nodejs进程内存中
- 第一,进程内存有限,访问量过大,内存暴增怎么办
- 第二,正式线上运行是多线程,进程之间无法共享
13. redis
-
web server 最常用的缓存数据库,数据存放在内存中
-
相比mysql,访问速度快
-
成本高,可存储数据量更小
-
session访问频繁,对性能要求高
-
session可不考虑断电丢失数据的问题
-
session数据量不会太大
-
为何网站数据不适合用redis
-
操作频率不是太高
-
断电不能丢失,必须保留
-
数据量大,内存成本高
14.安装redis
- brew install redis
- redis-server
- redis-cli
- set username xxxx
- get username
- del username
- keys *
15. redis存储session
16. 前端联调
- 登录功能依赖cookie,必须用浏览器联调
- cookie跨域不共享,前端和server端必须同域
- 需要用到nginx做代理,让前后端同域
17. nginx
- 高性能的web服务器,开源免费
- 一般用于做静态服务,负载均衡
- 反向代理
- brew install nginx
- sudo vi /usr/local/etx/nginx/nginx.conf
18. 登录总结
- cookie是什么?session是什么?如何实现登录
- redis在这扮演什么角色?
- nginx反向代理配置,链条过程中的作用
19. cors跨域
- http协议的规范,现代浏览器都支持
- 前端和服务端直接通讯,不用nginx做转发
- 通过服务端设置header来实现
20. response setHeader
- Access-Control-Allow-Credentials
- Access-Control-Allow-Origin
- Access-Control-Allow-Methods
- cors跨域,http规范,通过res.setHeader
- express框架,使用第三方中间件cors
- koa2框架,使用第三方中间件koa-cors
21. 日志
- nodejs文件操作,nodejs stream
- 日志功能开发和使用
- 日志文件拆分,日志内容分析
22. nodejs文件操作
- 日志要存储到文件中
- 为何不存储到mysql中
- 为何不存储到redis中
23.IO操作的性能瓶颈
- IO包括 网络IO 和 文件IO
- 相比于CPU计算和内存读写,IO的突出特点就是 慢
- 如何在有限的硬件资源下提高IO的操作效率
24.日志拆分
- 使用crontab拆分日志文件,使用readline分析日志内容
25. 安全
- sql注入:窃取数据库内容
- xss攻击:窃取前端的cookie内容
- 密码加密:保障用户信息安全
- 有些攻击需要硬件和服务支持,如DDOS
26. sql注入
- 最原始、简单的攻击,从web2.0就有sql注入攻击
- 攻击方式:输入一个sql片段,最终拼接成一段攻击代码
- 预防措施:使用mysql的escape函数处理输入内容
27.XSS攻击
- 攻击方式:在页面展示内容中掺杂js代码,以获取网页信息
- 预防措施:转换生成js的特殊字符
28. 密码加密
- 攻击方式:获取用户名和密码,再去尝试登录其他系统
- 预防措施:将密码加密
29.不使用框架开发server总结
- 开发了那些功能模块,完整的流程
- 处理http接口:路由、method、path、cookie、query
- 连接数据库:mysql
- 实现登录:cookie、session、redis
- 安全:xss、sql注入、密码加密
- 日志:stream写日志、readline分析日志
- 上线
- 用到了那些核心知识点
- http,nodejs处理http、处理路由,mysql
- cookie、session、redis,nginx反向代理
- xss、sql注入、密码加密
- 日志、stream、contrab、readline
- 回归“server和前端的区别”
- 服务端稳定性
- 内存cpu(优化 stream:IO性能瓶颈,扩展 redis扩展数据)
- 日志记录
- 安全(包括登录校验)
- 集群和服务拆分
30. 使用express
- express下载,安装和使用,express中间件机制
- 安装 express-generator
- npm install express-generator -g
- express express-test
- 初始化代码,处理路由
- 使用中间件
31. 介绍app.js
- 各个插件的作用
- 思考各个插件的实现原理
- 处理get、post请求
32. 中间件机制
- app.use
- next是什么
33. express开发接口
-
登陆
- 使用express-session和connect-redis
- req.session保存登录信息,登陆校验做成express中间件
-
日志
- access log记录 直接使用脚手架推荐的morgan
- 自定义日志使用console.log console.error
34. express中间件原理
- 回归中间件使用
- 分析如何实现
- app.use用来注册中间件,先收集起来
- 遇到http请求,根据path和method判断出发哪些
- 实现next机制,即上一个通过next触发下一个
- 代码演示
31. 使用koa2
- express中间件是异步回调,koa2原生支持async/await
- 新开发框架和系统,基于koa2,如egg.js
- async、await语法介绍,安装和使用koa2
- 开发接口,连接数据库,实现登录,日志记录
- 分析koa2中间件原理
- 安装(使用脚手架)
- npm install koa-generrator -g
- Koa2 koa2-test
- 初始化代码,处理路由
- 使用中间件
- 有很多app.use
- 代码中的next参数是什么
36. koa2开发接口
- 实现登录:基于koa-generic-session和koa-redis
37.koa2中间件原理
- app.use用来注册中间件,先收集起来
- 实现next机制,即上一个通过next触发下一个
- 不涉及method和path的判断