# nodeJS-学习 **Repository Path**: ST_wzc/nodeJS ## Basic Information - **Project Name**: nodeJS-学习 - **Description**: node.js 学习 - **Primary Language**: NodeJS - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-14 - **Last Updated**: 2021-02-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: Nodejs ## README ## http 请求概述 **1. 再浏览器输入 url 到页面显示经过那些操作** DNS 解析,建立 TCP 连接,发送 http 请求(三次握手,客户端) server 接收到 http 请求,处理,并放回(服务端) 客户端接收到返回数据,处理数据(如渲染页面,执行 js,客户端) **2. 从 0 搭建开发环境** 2.1 使用 nodeman 检测文件的变化让他自动重启 node npm install -g nodemon (管理员命令行安装) 2.2 使用 cross-env 设置环境变量 npm install --save-dev cross-env 2.3 package.json 配置 "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js", "prd": "cross-env NODE_ENV=production nodemon ./bin/www.js" } **3. mysql** 下载 mysql https://dev.mysql.com/downloads/mysql/ root 001024 下载 workbench https://dev.mysql.com/downloads/workbench/ ## mysql 语句 **1. 连接表** use 表; **2. 查询全部表** show tables; **3. 插入语句** insert into 表 (键) values (值) 关键字用 `` 包裹: insert into users (username, `password`, realname) values ('lisi', '123', '李四'); **4. 查询语句** 1. 普通查询: select * from 表; ( * 查全部) select 字段 from 表: select id,username from users; 2. 查询条件: where (当 username='zhangsa1n'出现) and -- 并且 or -- 或者 like '%查询内容%' -- 模糊查询 select * from users where username='zhangsa1n'; select * from users where username='zhangsan' or `password`='123'; select * from users where username like '%zhan%'; 3. 根据字段排序: order by 字段 -- 正序 order by 字段 desc -- 倒序 根据 id 排序: select * from users where username like '%s%' order by id; select * from users where username like '%s%' order by id desc; 4. 子查询: 查询 like_article 表 拿到的数据,用于查 blogs 表: select * from blogs where id in (select article_id from like_article where user_id='2') 5. 连表查询: 根据点赞表查询对应博客(分页): 点赞表为e, 博客表为d, left join:向博客表查询, on:博客id = 点赞表的博客id 为 用户id是 1 的数据,根据点赞时间排序 select d.id,d.title,d.createtime from like_article e left join blogs d on d.id = e.article_id where user_id=${user_id} order by e.createtime desc limit ${pageNum * pageSize}, ${pageSize}; 6. 分页查询 limit m,n分页语句:(第一页是从0开始) select * from 表 order by id desc limit ${pageNum * pageSize}, ${pageSize}; 7. 根据上个语句查询总数量(sql_calc_found_rows) select sql_calc_found_rows * from 表 select found_rows() as total; **5. 更新语句** 1. 解决更新语句报错(执行完删掉即可) You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. SET SQL_SAFE_UPDATES = 0 2. update 表 set 替换内容 where 替换对应的值(没加会把表中的数据都替换) 把 users 中 username='lisi' 的 realname 替换成 李四 2 update users set realname='李四 2' where username='lisi'; **6. 删除语句** 1. 删除 users 中 username='lisi'(如果没有加 where 语句,那么就会删除整个表) delete from users where username='lisi' 2. 项目中不会用 delete 去删除数据,而是用状态让他假装是已被删除 select * from users where state<>'0'; -- <>不等于 update users set state='0' where username='lisi'; -- 软删除 **7. 数据库版本查询** select version(); ## node.js 使用数据库 1. 安装 mysql 插件 npm i mysql ## Redis https://www.runoob.com/redis/redis-install.html https://www.cnblogs.com/Luwak90/p/9412492.html **1. 内存数据库(读写快),用于存储 session (存放登陆数据)** **2. 启动:** 1. redis-server.exe 这时候另启一个 cmd 窗口,原来的不要关闭,不然就无法访问服务端了。 2. redis-cli.exe -h 127.0.0.1 -p 6379 **3. 命令** 设置: set 设置名称 设置值 获取: get 名称 获取全部: keys * 删除: del 名称 **4. 安装 redis 插件** npm i redis -save ## http-server **本地服务器,用于预览web** 安装 npm install http-server -g 启动 http-server -p 端口 ## nginx 1. 高性能的 web 服务器 2. 一般用于做静态服务,负载均衡 3. 反向代理 **nginx 配置** 配置文件: C:\nginx\conf\nginx.conf 反向代理: 1. 前端页面 ```js location / { proxy_pass http://localhost:8002; } ``` 2. 接口 ```js location /api/ { proxy_pass http://localhost:8001; proxy_set_header Host $host; } ``` cd C:\nginx 启动:start nginx 关闭:nginx.exe -s quit ## sql 注入 1. 例如:用户名中输入 wzc' -- 直接可以登陆,不需要密码 select username,realname from users where username='wzc' -- ' and `password`='123' 2. 预防: mysql.escape username = escape(username) sql 语句对应的单引号去掉 ## xxs 攻击 1. 攻击方式:在页面展示内容中参杂 js 代码,以获取页面信息 2. 例子: 3. 预防:转换生成 js 的特殊字符 4. 安装预防插件:npm i xss --save 5. 使用: 引入, 然后调用 xss() 函数 ## 密码加密 1. nodeJs 自带加密库: crypto 2. 实例在: blog-1\src\utils\cryp.js ## express 框架 **1. 安装 express(使用脚手架 express-generator)** 安装: npm install express-generator -g 创建:express 文件名 安装依赖: npm install 运行:npm start **2. 配置热更新** 安装:npm i nodemon cross-env --save-dev 在 package.json 的 scripts 中配置运行命令 "dev": "cross-env NODE_ENV=dev nodemon ./bin/www" **3. 目录介绍** bin 配置文件 public 静态文件(忽略,前后端混合用的) routes 路由 views 模板(忽略,前后端混合用的) app.js 入口文件 ## koa2 **1. 安装 koa2(使用脚手架 koa2-generator)** 安装: npm install koa-generator -g 创建: Koa2 名称 安装依赖: npm install 运行:npm run dev **2. 配置热更新** 安装:npm i cross-env --save-dev 在 package.json 的 scripts 中配置运行命令 "dev": "cross-env NODE_ENV=dev ./node_modules/.bin/nodemon bin/www", **3. 目录介绍** bin 配置文件 public 静态文件(忽略,前后端混合用的) routes 路由 views 模板(忽略,前后端混合用的) app.js 入口文件 ## 接口开发流程 1. 搭建环境 2. 配置环境 如: mysql, redis, 登陆中间件, controller, model 3. 初始化路由并开发路由 4. 前端联调 5. 放 pm2 上线 ## PM2 **1. 安装,启动** 1.1 pm2需要全局安装(必须在管理员中运行): npm install -g pm2 1.2 在项目的 package.json 中 的 scripts 配置启动 PM2 "prd": "cross-env NODE_ENV=production pm2 start bin/www", 1.3 npm run prd 启动线上环境 **2. 进程守护,系统崩溃自动重启** **3. 启动多线程,充分利用cpu和内存** **4. 自带日志记录功能** **5. 常用命令** 1. pm2需要全局安装(必须在管理员中运行): npm install -g pm2 2. 启动项目:pm2 start 启动的入口文件(一般为app.js) --name 名称 3. 重命名项目: pm2 start 启动的入口文件 --name 重命名 4. 查看运行项目:pm2 ls 5. 重启项目:pm2 restart 名称 6. 重新启动所有项目: pm2 restart all 7. 停止项目:pm2 stop 自定义名称 8. 停止所有项目:pm2 stop all 9. 删除项目:pm2 delete 自定义名称 10. 删除所有项目:pm2 delete all 11. 查看某个项目具体情况: pm2 describe 自定义名称 12. 查看pm2的日志: pm2 logs 自定义名称 13. 查看项目的资源消耗情况: pm2 monit 14. 查看项目信息: pm2 inof 自定义名称 15. 查看日志: pm2 log 自定义名称 **6. 配置文件** ```json { "apps": { "name": "blog-koa2-server", // 名称 "script": "bin/www", // 入口 "watch": true, // 是否热更新 // 忽略监听修改文件 "ignore_watch": [ "node_modules", "logs" ], "instances": 4, // 配置进程:四核 "error_file": "logs/err.log", // 错误日志存储路径 "out_file": "logs/out.log", // 访问日志存储路径 "log_date_format": "YYYY-MM-DD HH:mm:ss" // 在日志前面添加时间段 } } ```