文章目录
Node.js——博客系统
Node.js 的真正用途
- Node.js,一个 javascript 的运行环境
- 运行在服务器,作为 web server
- 运行在本地,作为打包、构建工具
学习 Node.js 的困惑
- Node.js 运行在服务端,而非浏览器环境
- 服务端开发的思路和套路,与前端完全不一样
Node.js 安装
Windows 系统环境安装 Node.js 参考:https://blog.csdn.net/longestory/article/details/108742759?utm_source=app
MacOS 系统环境安装 Node.js 参考:
https://blog.csdn.net/longestory/article/details/108742936?utm_source=app
nvm 安装和管理多版本 Node.js 参考:
https://blog.csdn.net/longestory/article/details/108743099?utm_source=app
node.js 和 javascript 的区别
ECMAScript(定义了语法规范)
javascript(使用 ECMAScript 语法规范,外加 Web API)
node.js(使用 ECMAScript 语法规范,外加 node.js API)
common.js
npm init -y:初始化
debugge:调式
server 开发和前端开发的区别
- 服务稳定性
- 考虑内存和 CPU (优化,扩展)
- 日志记录
- 安全
- 集群和服务拆分
博客项目介绍
目标
- 博客系统,具有博客的基本功能
- 只开发 server 端,不关心前端
需求
- 首页,作者主页,博客详情页
- 登录页
- 管理中心,新建页,编辑页
技术方案
- 数据如何存储(博客,用户)
- 如何与前端对接,即接口设计
开发接口(不用任何框架)
- node.js 处理 http 请求
- 搭建开发环境
- 开发接口
DNS 解析,建立 TCP 连接,发送 http 请求
server 接收到 http 请求,处理,并返回
客户端接收到返回数据,处理数据(渲染页面,执行 js)
get 请求和 querystring
post 请求和 postdata,客户端要向服务端传递数据(postman)(安装软件,可以测试请求的数据)
路由
搭建开发环境
使用 nodemon 监测文件变化,自动重启 node
使用 cross-env 设置环境变量,兼容 mac linux 和 windows
npm i nodemon cross-env --save-dev
开发接口
初始化路由:根据之前技术方案的设计,做出路由
返回假数据:将路由和数据处理分离,以符合设计原则
router:处理路由
controller:处理数据
MySql
mysql 介绍、安装和使用
- web server 中最流行的关系型数据库
- 官网可免费下载,用于学习
- 轻量级,易学易用
官网下载地址:
https://dev.mysql.com/downloads/mysql/
workbench
操作 mysql 的客户端,可视化操作
下载地址:workdown
操作数据库
CREATE DATABASE myblog:创建一个名为 myblog 的数据库
CREATE TABLE users:创建一个名为 users 的表
insert into users (username,password,realname) values ('haha','123456789','哈哈');:插入
select * from users;:查询所有
select * from users where username='haha' and realname='哈哈';:多条件查询
select * from users where realnamelike '%哈哈%';:模糊查询
select * from users where password like '%123%' order by id desc;:查到的结果倒序排列
update users setpassword='123' where username='wuwu';:修改
update blogs set author='xixi' where title='标题B';:修改 author 为 xixi
delete from users where username='haha';:删除 username 为 haha 的数据
update users set state='0' where username='haha';:软删除,牢记,修改 username 为 haha 的 state 为 0,
show databases;
node.js 连接 mysql
如果遇到错误ER_NOT_SUPPORTED_AUTH_MODE,解决方法:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';(在 mysql 中执行)
错误原因:密码的加密方式
cross-env
npm run dev
API 连接 mysql
保证 server 端的安全性
mysql模块安装:npm i mysql
登录
核心:登录校验 & 登录信息存储
cookie 和 session
cookie
- 存储在浏览器的一段字符串(最大 5kb)
- 跨域不共享
- 格式如 k1=v1;k2=v2;k3=v3; 因此可以存储结构化数据
- 每次发送 http 请求,会将请求域的 cookie 一起发送给 server
- server 可以修改 cookie 并返回给浏览器
- 浏览器中也可以通过 javascript 修改 cookie(有限制)
客户端 javascript 操作 cookie
- 客户端查看 cookie,三种方式,开发者工具(Network、Application)、浏览器控制台(document.cookie)
- javascript 查看、修改 cookie(有限制)
server 端 node.js 操作 cookie
- 查看 cookie
- 修改 cookie
- 实现登录验证
解决乱码:res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
cookie 的问题:暴露 username,很危险
解决:cookie 中存储 userid,server 端对应 username
session,即 server 端存储用户信息
session 写入 redis
session 的问题:目前 session 直接是 js 变量,放在 node.js 进程内存中;进程内存有限,访问量过大,内存暴增怎么解决;正式线上运行是多进程,进程之间内存无法共享
redis
- web server 最常用的缓存数据库,数据存放在内存中
- 相比于 mysql,访问速度快(内存和硬盘不是一个数量级的)
- 成本更高,可存储的数据量更小(内存的硬伤)
将 web server 和 redis 拆分为两个单独的服务
双方都是独立的,都是可扩展的(例如都扩展成集群)
(包括 mysql,也是一个单独的服务,也可扩展)
session 适用 redis:session 访问频繁,对性能要求极高;session 可不考虑断电丢失数据的问题(内存的硬伤);session 数据量不会太大(相比于 mysql 中存储的数据)
网站信息不适用 redis:操作频率不是太高(相比于 session 操作);断电不能丢失,必须保留;数据量太大,内存成本太高
redis 安装(windows):
操作:cmd 中
redis-server.exe redis.windows.conf:启动 redis 服务;
窗口不要关,再新开一个 cmd 窗口;redis-cli:登录 redis
redis模块安装:npm i redis
开发登录功能,和前端联调(用到 nginx 反向代理)
登录功能依赖 cookie,必须用浏览器来联调
cookie 跨域不共享的,前端和 server 端必须同域
需要用到 nginx 做代理,让前后端同域
http-server模块安装:npm i http-server
nginx
- 高性能的 web 服务器,开源免费
- 一般用于做静态服务、负载均衡
- 反向代理
nginx 下载:官网下载:(稳定版)
nginx 配置 很重要
日志
系统没有日志,就等于人没有眼睛——抓瞎
第一,访问日志 access.log(server 端最重要的日志)
第二,自定义日志(包括自定义事件、错误记录等)
node.js 文件操作,node.js stream
日志功能开发和使用
日志文件拆分,日志内容分析
IO 操作的性能瓶颈
IO 包括“网络 IO”和“文件 IO”
相比于 CPU 计算和内存读写,IO 的突出特点就是:慢
如何在有限的硬件资源下提高 IO 的操作效率?stream
日志内容会慢慢积累,放在一个文件中不好处理
按时间划分日志文件,如 2020-10-21.access.log
实现方式,使用 crontab 拆分日志文件,使用 readline 分析日志内容
安全
sql 注入:窃取数据库内容(解决:escape)
XSS 攻击:窃取前端的 cookie 内容
密码加密:保障用户信息安全(重要)
express
express 是 node.js 最常用的 web server 框架
如果遇到错误about_Execution_Policies,参照