# blog_node **Repository Path**: gongyz/blog_node ## Basic Information - **Project Name**: blog_node - **Description**: node开发个人博客 — 原生node版 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-06-14 - **Last Updated**: 2021-12-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Node开发博客项目 ### 项目简述 本项目不借助框架,使用原生 Node 开发个人博客。 ![mark](https://gongyz.oss-cn-shenzhen.aliyuncs.com/blog/mXYEXLraehAz.png?imageslim) ### 导入数据库表 1. 创建并选择数据库 ```shell mysql> create database blog; mysql> use blog; ``` 2. 设置数据库编码 ```shell mysql> set names utf8mb4; ``` 3. 导入数据 ```shell mysql> source [sql文件路径] ``` ### 开发流程 #### 搭建开发环境 安装 node、mysql、redis #### 需求 首页 博客详情页 登录页 管理中心:新建、删除、编辑 #### 接口设计 ![mark](http://gongyz.oss-cn-shenzhen.aliyuncs.com/blog/20191217/085934319.png) #### 开发接口 1、mock 数据,测试接口是否正常 2、连接数据库,对接真实数据 ### 开发记录 #### 问题 ndoe 返回数据使用res.write(),该方法不能直接返回JSON格式的数据,需要使用JSON.Stringfy处理数据 #### 项目说明 为了开发以及后期的维护更加方便,项目拆分为以下核心的几层 router层—> controller层 —> dao层 流程:router层处理请求,响应数据,controller处理业务逻辑,dao层进行数据库的增删改查操作(CRUD操作) #### 登录功能 ##### 鉴权方式 登录功能使用了 cookie-session 的鉴权方式,这种鉴权方式的基本思路是初次访问时,服务器会设置一个sessionid,通过 cookie 传给浏览器,再次请求时,浏览器通过 cookie 把 sessionid 传回给服务器,服务器通过sessionid 去 session 中拿用户信息,如果没有,就表示用户未登录。 ##### session 的问题 目前,session 直接是JS变量,放在nodejs进程的内存中,存在以下问题: 1. 进程的内存有限,访问量过大,内存暴增,程序容易崩溃,此时 session 数据丢失,用户需要重新登录。 2. 正式环境可能是多进程(集群),进程之间无法共享内存,也就无法共享 session 数据。 ##### redis 为了解决这个问题,redis 内存数据库来存储 session,redis可以满足 session 访问频繁且断电恢复(需进行配置)的需求。 redis 基本命令 ```bash set key value get key keys * flushall ``` ##### 日志 不管是什么项目,日志一直是一个重要组成部分,它可以随时供你查看重要数据信息,包括访问日志、错误记录等,项目中使用node.js的 stream 将日志存储在文件中。 **日志拆分** 随着日志内容慢慢累积,放在一个文件中不好处理,我们可以按时间划分日志文件,如2019-07-10.access.log,实现方式:linux的 `crontab`命令,创建定时任务 ```shell # 日志拆分 shell 脚本 #!/bin/sh # cd /Users/wfp/Project/video-tutorial/node-tutorial/code-demo/blog-1/logs # cp access.log $(date +%Y-%m-%d).access.log # echo "" > access.log ``` **日志分析** 日志是按行存储的,一行就是一条日志,我们可以使用 node.js 的 readline(基于stream、效率高),针对access.log日志,分析chrome的占比。 ```js const fs = require('fs') const path = require('path') const readline = require('readline') // 文件名 const fileName = path.join(__dirname, '../', 'logs', 'access.log') // 创建 read stream const readStream = fs.createReadStream(fileName) // 创建 readline 对象 const rl = readline.createInterface({ input: readStream }) let chromeNum = 0 let sum = 0 // 逐行读取 rl.on('line', (lineData) => { if (!lineData) { return } // 记录总行数 sum++ const arr = lineData.split(' -- ') if (arr[2] && arr[2].indexOf('Chrome') > 0) { // 累加 chrome 的数量 chromeNum++ } }) // 监听读取完成 rl.on('close', () => { console.log('chrome 占比:', (chromeNum / sum).toFixed(4) * 100 + '%' ) }) ``` ##### 安全问题 1、sql注入:利用sql语句的漏洞,窃取数据库内容 预防措施: sql 拼接容易引起 sql 注入攻击,最好是使用 sql参数化 查询或者预处理,这是使用 mysql 提供的escape函数对输入内容进行处理。 2、xss攻击:在页面插入js代码,窃取前端cookie内容 预防措施:、 引入 xss,模块,对参数进行处理,转换类似