# node-study **Repository Path**: olyluck/node-study ## Basic Information - **Project Name**: node-study - **Description**: 学习项目:Node.js从零开发web server博客项目 - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-14 - **Last Updated**: 2025-06-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 说明 ## mysql mysql的安装以及连接 加入环境变量 初始化 密码 命令 sql解除安全模式等 连接Navicat ## cookie #### 浏览器操作cookie document.cookie = "k1=v1;k2=v2" 相同的key可以替换 ,不同的key只能拼接而不能覆盖 利用cookie实现登录验证 #### 服务端操作cookie Set-Cookie 可以给前端设置cookie(新建或修改), 下次发送请求会携带 httpOnly 的cookie 无法通过document.cookie查看和修改 #### cookie安全 cookie只有5k大小 cookie存储用户信息不安全,因此采用服务端session方案, 即浏览器cookie存储userId,对应服务端session的userName ## session 前端存储的cookie的userId是没有规律的,保证安全 访问接口时,如果没有获取到cookie,就设置cookie 将userName等用户信息存储在session变量中 再次访问该接口,如果userName存在,则免验证 即:首次访问时,后端生成session,并返回对应的cookie给前端,前端将cookie存储起来,之后在有效期内访问时,会携带该cookie,后端会获取到之前生成的session ***从后端思维考虑:安全、稳定*** 安全:不同浏览器必然是不同用户,后端session、前端cookie必然不同(相同浏览器重新生成之后也不相同) ## Redis Redis是一个内存数据库,用于存储session 启动Redis:redis-cli(端口默认6379,需要加入环境变量) 如果后端服务器关闭,session会丢失,但是Redis不会丢失 有几个用户,redis里面就会存储几个session express推荐使用2.0版本Redis,否则 与 connect-Redis 不兼容 ## nginx 反向代理 静态资源、api可能都有各自的服务器,在随意某个地址上访问他们会跨域,必须代理 / 根目录代理静态资源 /api 目录代理api ## 日志 #### access log 服务端访问日志 #### event.log 自定义记录日志 ## 安全 #### sql注入 ```sql select * from users where userName='lisi' -- and pwd=12345 ``` 如果客户端输入sql字符串,sql在服务器上执行攻击 比如 --space 可以执行注释 delete from table drop datebase insert update等攻击数据库 #### 防止攻击 使用mysql.escape() 转码,凡是动态sql都要处理 #### xss攻击 xss.js #### 密码加密 crypto.js 注册时数据库存储加密的密码 ## express #### 中间件 ``` app.use(function(req,res,next){}, function(req,res,next){}) app.get('',function(req,res,next){}) app.post('',function(req,res,next){},function(req,res,next){}) // function(req,res,next){} 即中间件 // 中间件如果必须向后执行,则要执行next ``` **可以连续使用多个中间件 ,比如某个路由需要登录校验的中间件为前置** #### 多个app.use('xx', function(req,res,next){})执行顺序: app.use可以同时匹配get/post 如果没有第一个参数,则按照顺序依次执行 如果执行完成后没有next,则后面的中间件都不再执行 如果路径能够**部分匹配**(比如 /a/b能匹配 根路径以及/a /b),则中间件会执行【注意 router.get/post只能匹配完整的路由】 必须等上一个app.use的中间件 或者 当前app.use的上一个中间件执行到next,才能向后执行,即使function(req,res,next){}中存在异步 ``` app.use((req, res, next)=> { setTimeout(() => { // 模仿post req.body = { a: 12, b: 'xs' } console.log('这是异步。。。') next() }, 3500); }) ```