NodeJS笔记
#
nodejs 介绍#
使用 nvm 下载和安装brew install nvm 安装 nvm
nvm list 查看当前所有的 node 版本
nvm install v10.13.0 安装指定的版本
nvm use --delete-prefix 10.13.0 切换到指定的版本
#
nodejs 和 js 的区别es 语法规范
js 使用 es 语法规范 外加 WebAPi DOM 操作,BOM 操作,事件绑定,Ajax 完成浏览器端任何操作
nodejs 使用 es 语法规范 外加 NodejsAPI 处理 http 请求,处理文件 完成 server 端任何操作
#
commonjs 模块#
debugge 方式使用 VsCode 进行 debugge
#
server 端和前端的区别- 服务稳定性 (server 端可能会遭受恶意攻击和误操作) (不能意外挂掉) (PM2 做进程守候)
- 考虑内存和 cpu(优化,扩展) (使用 stream 写日志,使用 redis 存 session)
- 日志记录
- 安全
- 集群和服务拆分
#
项目介绍(项目在根目录下 NodejsWebServerBlog)#
目标- 博客系统,具有博客的基本功能
- 只开发 server 端
#
需求- 首页,作者主页,博客详情页
- 登陆页
- 管理中心,新建页,编辑页
#
技术方案#
数据存储博客
| id | title | content | createtime | author | | ------ | -----: | :----: | :----: | :----: | | 1 | 标题 1 | 内容 1 | 1542312323232 | wt |
用户
id username password realname 1 wt 123 文涛
#
接口设计#
关于登陆- 业界有统一的解决方法,一般不用再重新设计
- 实现起来比较复杂,课程后面会讲解
#
接口(不用任何框架)#
nodejs 处理 http 请求#
nodejs 处理 get 请求#
nodejs 处理 post 请求#
nodejs 处理路由#
处理 http 请求的综合示例#
搭建开发环境使用 nodemon 监测文件变化,自动重启 node 使用 cross-env 设置环境变量,兼容 mac linux 和 windows
#
开发接口,路由(看项目文件夹)#
补充:路由 和 APIAPI:
前端和后端,不同端之间对接的一个术语
url(路由) api/blog/list
路由: API 的一部分 后端系统内部的一个定义
#
原生开发#
数据存储#
表操作经典 SQL 语句大全 https://blog.csdn.net/znyyjk/article/details/52717336
#
nodejs 连接 mysqlnpm install mysql
#
登陆核心: 登陆校验 & 登陆信息存储
cookie 和 session
session 写入 redis(内存数据库)
#
cookie- 存储再浏览器的一段字符串(最大 5kb)
- 跨域不共享
- 格式如 k1=v1;
- 每次发送 http 请求,会将请求域(要访问的页面)的 cookie 一起发送给 server
- server 可以修改 cookie 并返回给浏览器
- 浏览器也可以通过 js 修改 cookie(有限制)
#
server 端 nodejs 操作 cookieres.setHeader('Set-Cookie', username=${data.username}; path=/; httpOnly; expires=${getCookieExpires()}
)
#
session上一节的问题:用 cookie 会暴露 username 如何解决:cookie 中存储 userid,server 端对应 username 解决方案:session 即 server 端存储用户信息
#
cookie 和 session 的区别:1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。 2、cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗 考虑到安全应当使用 session。 3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用 COOKIE。 4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。 5、所以个人建议: 将登陆信息等重要信息存放为 SESSION 其他信息如果需要保留,可以放在 COOKIE 中
session 和 cookie 的生命周期 Session 存储在服务器端,一般放在服务器的内存中(为了高速存取),Sessinon 在用户访问第一次访问服务器时创建,需要注意只有访问 JSP、Servlet 等程序时才会创建 Session,只访问 HTML、IMAGE 等静态资源并不会创建 Session,可调用 request.getSession(true) 强制生成 Session。
#
session 的问题目前 session 直接是 js 变量 也就是 SESSION_DATA 是一个对象,放在 nodejs 进程内存中
- 进程内存有限,访问量过大,内存暴增怎么办
- 正式线上运行是多线程,进程之间内存无法共享
解决方案:redis
#
redis#
介绍- web server 最常用的缓存数据库,数据放在内存中
- 相比于 mysql,访问速度快(内存和硬盘不是一个数量级的)
- 但是成本更高,可存储的数据量更小(内存的硬伤)
相当于将 web server 和 redis 拆分成两个单独的服务 双方都是独立的,都是可扩展的
为什么 session 不放在 mysql 中?
- 因为 session 访问频繁,对性能要求极高
- session 可不考虑断电丢失数据的问题(数据不是很重要,大不了重新登陆 同时也是内存的硬伤,做配置也可以断电不丢失)
- session 数据量不会太大(相比与 mysql 中存储的数据)
#
安装MAC 使用 brew install redis 用 2 个终端执行 执行 redis-server 执行 redis-cli
#
nodejs 连接 redisnpm install redis
#
nginx高性能 web 服务器 开源免费 一般用于做静态服务,负载均衡 反向代理
#
安装brew install nginx
打开配置文件 Mac: sudo vim /usr/local/etc/nginx/nginx.conf nginx -t // 测试配置文件格式是否正确 nginx // 启动 nginx -s reload // 重启 nginx -s stop // 停止
#
日志- 访问日志(access log)
- 自定义日志(自定义事件,错误记录)
- nodejs 文件操作,nodejs stream(性能)
- 日志功能开发和使用
- 日志文件拆分,日志内容分析
#
stream(IO 操作的性能瓶颈)(项目在根目录下 NodejsWebServerBlog/stream-test)#
日志拆分实现方式:linux 的 crontab 命令,即定时任务 设置格式: *command (5 课星号分别代表:分钟 小时 日期 月份 星期几 ) 将 access 拷贝并重命名 2021.5.17.access.log 清空 access.log 文件 继续积累日志
主要是运维用 shell 脚本
#
日志分析使用 nodejs 的 readline (基于 stream,效率高)
#
安全server 端攻击方式多 预防方式也多 本课只讲常用的 web server 层面的 有些需要硬件和服务支持(OP 支持),如 DDOS
sql 注入:窃取数据库内容 攻击方式:输入一个 sql 片段 ,最终拼接成一段攻击代码 预防措施:使用 mysql 的 escape 函数输入内容即可
xss 攻击:窃取前端的 cookie 攻击方式:输入 js 代码让浏览器执行 预防措施: 防范 XSS 是需要后端 RD 和前端 RD 共同参与的系统工程 转义应该在输出 HTML 时进行,而不是在提交用户输入时。 不同的上下文,如 HTML 属性、HTML 文字内容、HTML 注释、跳转链接、内联 JavaScript 字符串、内联 CSS 样式表等,所需要的转义规则不一致。 业务 RD 需要选取合适的转义库,并针对不同的上下文调用不同的转义规则。 其他安全措施: HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。 验证码:防止脚本冒充用户提交危险操作。 npm i xss --save // 预防 xss 攻击的 npm 包 给可能会被 xss 攻击的参数用 xss 方法包一下
密码加密:保护用户信息 万一数据库被攻破,用户信息是不应该泄露的
#
express 框架开发#
安装 express-generator 脚手架- npm install express-generator -g
- express 文件夹名字
#
介绍 app.js#
express 中间件机制 / app.use 和 next#
登陆使用 express-session 和 connect-redis
#
日志access log 记录 使用脚手架推荐的 morgan
自定义日志使用 console.log 和 console.error 即可
#
中间件原理 (NodejsWebServerBlog/lib/express/like-express.js)#
Koa2 框架开发#
安装 koa-generator 脚手架- npm install koa-generator -g
- koa2 文件夹名字
#
介绍 app.js#
登陆使用 koa-generic-session 和 koa-redis
#
日志access log 记录 使用 morgan (morgan 仅支持 express 所以要安装 koa-morgan 兼容实现)
自定义日志使用 console.log 和 console.error 即可
#
中间件原理 (NodejsWebServerBlog/lib/koa2/like-koa2.js)#
上线与配置 PM2#
PM2 介绍 也是 PM2 的核心价值- 进程守护,系统崩溃自动重启
- 多进程,充分利用 cpu 和内存
- 自带日志记录功能
#
下载安装npm install pm2 -g
#
常用命令#
进程守护pm2 遇到进程崩溃,会自动重启
#
配置新建 PM2 配置文件 (包括进程数量,日志文件目录等)
修改 PM2 启动命令,重启
#
多进程为何使用?:操作系统会限制一个进程的最大可用内存 无法利用机器全部内存和多核 cpu 的优势
#
关于运维一般由专业的 OP 人员和部门来处理 中小型推荐使用云服务 如 阿里云的 node 平台