Node.js 初学者指北

好多年前写的笔记移动到博客上

安装

  • 直接下载安装
  • nvm 可实现版本管理 windows github 直接搜索nvm-windows
  • mac 使用brew install npm

nvm 命令

  • nvm list 查看node版本
  • nvm install v10.15.0 安装指定版本
  • 切换版本 nvm use –delete-prefix 10.15.0

nodejs 和js的区别

  • ECMAscript 语法规范 定义语法 变量 循环 判断 并不能操作dom 鉴定click事件 不能发送ajax请求
  • 不能处理http请求 不能操作文件
  • js 使用ES语法规范外加Web API 缺一不可
  • DOM操作BOM操作 事件绑定 ajax等
  • 两者结合即可完成浏览器端的任何操作
  • node js 使用ES语法规范 外加nodejs API
  • 处理http 处理文件 等

页面

  • 首页
  • 作者主页
  • 博客详情页
  • 后台用户登入页
  • 后台管理页, 新建博客,编辑博客

技术方案(通过需求一步一步实现方案)

  • 数据如何存储
  • 如何与前端对接,即接口

面试题

  • http请求概述
  • DNS解析,建立TCP链接,发送http请求(浏览器做的)
    • TCP 三次握手
    • 第一次客户端询问DNS服务器是否可用
    • 第二次服务器告诉客户端可用
    • 第三次 客户端收到回收收到了 即将访问http请求
  • server接收到http请求处理并返回
  • 客户端接收到返回数据,处理数据(如渲染页面,执行js)

nginx 反向代理解决跨域kookie不共享问题

介绍

  • nginx 免费 高性能web服务器
  • 一般做静态服务
  • 反向代理

nginx 命令

  • nginx -t 测试配置文件是否正确
  • 启动 nginx; 重启 nginx - s reload
  • 停止 nginx -s stop

使用

  • 第三行添加 worker_processes 2(启动cpu核心数)
  • 到 server listen 端口
  • location /(地址) root = {}

增加代理 无需:号

  • proxy_pass 代理地址
  • proxy_set_header Host $host; (要把host传到服务端)

日志

  • 系统没有日志, 就等于人没有眼睛 – 抓瞎
  • 第一访问日志 access log (server 重要日志)
  • 第二 自定义日志 (自定义事件 错误日志)

文件操作 nodejs stream(‘流’)

  • 日志开发使用
  • 日志文件拆分, 日志内容分析

文件操作

  • 引入 fs
  • 引入 path
  • 日志文件 txt & log

IO操作的性能瓶颈

  • IO 包括 “网络io” 和 ‘文件io’
  • stream 解决

安全

  • sql 注入: 窃取数据库内容 更新删除查询
  • xss攻击 窃取前端的cookie内容
  • 密码加密: 保障用户信息安全 (重要)

补充 通过 webserver 层面预防

  • 有些攻击需要硬件和服务来支持(需要OP支持) 如 DDOS

sql 注入

  • 有交互开发 就有这种攻击方式
  • 攻击方式 输入一个sql片段, 最终拼接成一段攻击代码
  • 如 拼接的时候注释后面的sql代码 – ;
  • 预防措施: 使用 escape 函数处理输入内容即可
  • escape 是 mysql 自带的函数

xss 攻击

  • 攻击方式: 内容中 掺杂js代码, 以获取网页信息
  • 预防方式 转换生成js的特殊字符
  • 安装xss npm i xss 它是一个函数

密码加密

  • 万一数据库被用户攻破, 最不应该泄露的就是用户信息
  • 攻击方式: 获取用户密码,再去尝试登入其他系统
  • 预防措施: 将密码加密, 即便拿到密码也不是明文
  • nodejs 使用crypto 加密

pm2

  • 进程守护 系统奔溃自动重启
  • 启动多进程 充分利用CPU和内存
  • 自带日志记录功能

pm2介绍

  • 安装 npm install pm2 -g
  • 版本 pm2 –version

基本使用

  • 启动进程 pm2 start …(配置文件)|| app.js
  • 查看进程列表 pm2 list
  • 重启 pm2 restart (appNmae) || id
  • 关闭 pm2 stop (appname) || id
  • pm2 info 服务信息
  • pm2 log
  • pm2 monit 进程cpu 信息

进程守护

  • 新建 pm2 配置文件 pm2.conf.json
1
2
3
4
5
6
7
8
9
10
11
12
{
"apps" : {
"name": "name",
"script": "app.js",
"watch": true,
"ignore_watch": ["logs", "node_modules"],
"instances":4,
"error_file": "path/log.log",
"out_file": "path/log.log",
"log_date_format": "YYY-MM-DD HH:mm:ss"
}
}
  • 修改 pm2 启动命令 重启
  • 访问 server 检查日志文件是否生效

多进程

  • 为何使用多进程
  1. 操作系统会限制进程最大内存
  2. 单个进程的内存是受限的
  • 多进程和redis
  1. redis 解决 session 共享
  2. 多进程访问一个 redis