目前剩余内容
-
后端nginx反向代理
-
上线配置
-
expree重写
-
koa2重写
一:前端样式
首页【未登录】
我的博客页
编辑/新增页
详情页
二:数据库简单配置
my_blog数据库
建一个blogs表、users表。
id自增长、主键、int,不能为null
createtime bigint(20) 填充0 前端传入Date.now()
user表
三:Node项目目录
所有
Node-blog目录
- module:模仿expree.js对路由进行封装
- app.js :主入口
- conf - db.js 公共的mysql配置
- controller 处理mysql的数据封装
- db - mysql.js mysql具体发送接受的封装
- model - model.js 返回参数统一定义
- router - router.js 路由处理封装
package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "cross-env NODE_ENV=dev nodemon app.js" },
"dependencies": {
"mysql": "^2.18.1"
},
"devDependencies": {
"cross-env": "^7.0.3","nodemon": "^2.0.7"
}
四:具体后端逻辑实现
module - route.js
conf db.js
db - mysql.js
model - resModel.js
app.js
controller blog.js
类似下面的写法,其他大同小异
router - blog.js
类似下面的写法,其他大同小异
五:sql注入,xss,密码加密,日志等
Sql注入
const escape = (value) => { return mysql.escape(value)}module.exports = { escape};
// 使用,案例
username = escape(username)
xss
npm install xss --save
const xss = require('xss');
// 使用,案例
username = escape(username)
密码加密
封装公共的密码加密文件 cryptoPwd.js
const crypto = require('crypto');const PWD_KEY = 'QQWW123_161sdsad..';const crytoPwd = (pwd) => { const md5 = crypto.createHash('md5'); const pwdStr = `pwd=${pwd}&key=${PWD_KEY}`; const newpwd = md5.update(pwdStr).digest('hex'); return newpwd;}module.exports = crytoPwd;
// 使用
password = crytoPwd(password)
日志
封装log.js处理,建立logs文件夹下的 .log文件收集信息
// log.js
const fs = require('fs');const path = require('path');const writeLog = (writeStream,log) => { writeStream.write(log+'\n');};const createWirteStream = (fileName) => { const fullName = path.join(__dirname,'../','../','logs',fileName) let writeStream = fs.createWriteStream(fullName, { flags: 'a', // 在后面继续写入 }) return writeStream;}const accessWriteLog = (log) => { const accessStream = createWirteStream('access.log'); writeLog(accessStream,log);}module.exports = { accessWriteLog};
// 使用
// 写入日志 const logStr = `${req.method} -- ${req.url} -- ${req.headers['user-agent']} -- ${Date.now()}`; accessWriteLog(logStr);
解析日志,使用node的readLine处理
// 读取日志信息const fs = require('fs');const path = require('path');const readLine = require('readline');const process = require('process');const fileName = path.join(__dirname,'../','../','logs','access.log');const fullName = fs.createReadStream(fileName);
let rl = readLine.createInterface({ input: fullName})rl.on('line',(line) => { if(!line){ return } console.log(line);})rl.on('close',() => { console.log("已结束"); process.exit(0); // 退出当前进程})
六:redis存储token等用户信息
npm install redis --save
封装一个redis文件,封装下get,set方法
const redis_config = { port: 6379, host: '127.0.0.1' };
const redis = require('redis');const { redis_config } = require("../conf/db")// 连接const redisClient = redis.createClient(redis_config.port, redis_config.host)redisClient.on('error', (err) => { console.log(err)})const get = (key) => { return new Promise((resolve,reject) => { redisClient.get(key, (err, val) => { if(err){ reject(err); }; if(!val){ resolve(null) } try { resolve(JSON.parse(val)) } catch (error) { resolve(val) } }) })};const set = (key, val) => { if (typeof val === 'object') { val = JSON.stringify(val); } redisClient.set(key, val, redis.print)};module.exports = { get, set}
每次请求接口时,取一下token对不对,是否存在,没有则生产一个用户token存储
const getResult = await get(token);
// 设置token部分 let token = req.cookie['token']; if (!token) { token = `${Date.now()}_${Math.random() * 100000}`; }; set(token, {})
七:目前写中遇到的问题
1:node对post请求的处理
你查大部分案例,都是querystring处理,但是我在处理时,返回的结果是:
我的输入
得到的结果
解决
// 监听请求 req.on('data', function (chunk) { req.body += chunk.toString(); });
req.on('end', function () {
req.body = JSON.parse(req.body)
// 可以直接使用
})
2:npm的mysql的包,在处理最新mysql版本时报错。
client does not support authentication protocol requested by server;
consider upgrading mysql client
如果按教程依然未解决问题的,你请看一下你的node用户权限是否弄好。需要先设置下用户,在修改协议。如果设置好,可以直接修改协议。