node.js实现前后端简单博客

1,533 阅读2分钟

目前剩余内容

  • 后端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用户权限是否弄好。需要先设置下用户,在修改协议。如果设置好,可以直接修改协议。