博客项目介绍

135 阅读6分钟

1. 目标

  1. 开发一个博客系统
  2. 只开发server端

2. 需求

  1. 首页,作者主页,博客详情页
  2. 登录页
  3. 管理中心,新建页,编辑页

3. 技术方案

  1. 数据如何存储
  • 博客 id title content createtime author
  • 用户 id username password realname
  1. 如何与前端对接,即接口设计
  • 获取博客列表 /api/blog/list get author作者,keyword搜索关键字

4. 搭建开发环境

  • 从0搭建,不使用框架
  • 使用nodemon检测文件变化,自动重启node
  • 使用cross-en设置环境变量,兼容mac和window

5.开发接口

  • 初始化路由:根据之前技术方案的设计,做出路由
  • 返回假数据:将路由和数据处理分离

6. nodejs连接mysql

  • 操作数据库
  1. 安装MySQL: brew install mysql
  2. 启动MySQL服务: brew services start mysql
  3. 停止MySQL服务: brew services stop mysql
  4. 重启MySQL服务: brew services restart mysql
  5. 查看MySQL服务状态: brew services list | grep mysql
  6. 进入MySQL命令行界面: mysql -u root -p
  7. 卸载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总结

  • 开发了那些功能模块,完整的流程
  1. 处理http接口:路由、method、path、cookie、query
  2. 连接数据库:mysql
  3. 实现登录:cookie、session、redis
  4. 安全:xss、sql注入、密码加密
  5. 日志:stream写日志、readline分析日志
  6. 上线 image.png
  • 用到了那些核心知识点
  1. http,nodejs处理http、处理路由,mysql
  2. cookie、session、redis,nginx反向代理
  3. xss、sql注入、密码加密
  4. 日志、stream、contrab、readline
  • 回归“server和前端的区别”
  1. 服务端稳定性
  2. 内存cpu(优化 stream:IO性能瓶颈,扩展 redis扩展数据)
  3. 日志记录
  4. 安全(包括登录校验)
  5. 集群和服务拆分

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的判断