使用koa2框架来开发,使用方式如下:
npm install koa-generator -g
koa2 project-name
cd project-name
npm install
然后npm run dev就可以跑起来了。
需要安装redis、MySQL客户端(本地调试需要用到),安装方法可在网上搜索。
还可以安装Workbench客户端,MySQL图形化管理工具,操作起来比较方便。
npm install cross-env --save-dev 设置环境变量
//package.json
"scripts": {
"dev": "cross-env NODE_ENV=dev ./node_modules/.bin/nodemon bin/www",
"prd": "cross-env NODE_ENV=production pm2 start bin/www"
}
mysql和redis的配置文件:
//项目中config/db.js
const env = process.env.NODE_ENV
//配置
let MYSQL_CONF
let REDIS_CONF
if (env === 'dev') {
MYSQL_CONF = {
host: 'localhost',
user: 'root',
password: 'password',
port: '3306',
database: 'myblog'
}
REDIS_CONF = {
port: 6379,
host: '127.0.0.1'
}
}
if (env === 'production') {
MYSQL_CONF = {
host: 'localhost',
user: 'root',
password: 'password',
port: '3306',
database: 'myblog'
}
REDIS_CONF = {
port: 6379,
host: '127.0.0.1'
}
}
module.exports = {
MYSQL_CONF,
REDIS_CONF
}
先 npm install mysql
封装mysql的使用方法
const mysql = require('mysql');
const { MYSQL_CONF } = require('../config/db');
//创建连接对象
const con = mysql.createConnection(MYSQL_CONF);
//开始连接
con.connect();
//统一执行sql的函数
function exec(sql) {
const promise = new Promise((resovle, reject) => {
con.query(sql, (err, result) => {
if (err) {
reject(err);
return
}
resovle(result)
})
})
return promise
}
module.exports = {
exec,
escape: mysql.escape
}
然后在匹配的路由中使用:
const { exec } = require('../db/mysql');
const getList = async (keyword) => {
let sql = 'select * from blogs where status=1 ';
if (keyword) {
sql += `and title like '%${keyword}%' `
}
sql += 'order by createtime desc;'
return await exec(sql)
}
session用来存储用户登录信息。代码如下:
npm install koa-generic-session koa-redis
//app.js
const session = require('koa-generic-session')
const redisStore = require('koa-redis')
const { REDIS_CONF } = require('./config/db')
/在注册路由前
//session配置
app.keys = ['sQWE_@12345']
app.use(session({
//配置cookie
cookie: {
path: '/',
httpOnly: false, //因为我前端需要来获取生成cookie来判断是否登录估设为false
maxAge: 24 * 60 * 60 * 1000
},
//配置redis
store: redisStore({
all: `${REDIS_CONF.host}:${REDIS_CONF.port}`
// host: REDIS_CONF.host,
// port: REDIS_CONF.port
})
}))
//登录路由中使用session记录用户信息
router.post('/login', async function (ctx, next) {
const { account, password } = ctx.request.body;
//login为登录方法 连接数据库返回用户信息
const userData = await login(account, password);
if (userData.account) {
//设置session
ctx.session.account = userData.account
ctx.session.realname = userData.realname;
ctx.body = new SuccessModel()
return
} else {
ctx.body = new ErrorModel('登陆失败');
}
})
某种特定的会重复使用的功能,我们一般会写成中间件来重复使用。
//一个登录中间件 middleware/loginCheck.js
const { ErrorModel } = require('../model/resModel');
module.exports = async (ctx, next) => {
//如果session中有用户信息 表示已经登录过了
if (ctx.session.account) {
await next()
return
}
//否则没有登录 给客户端报401
ctx.status = 401
ctx.body = new ErrorModel('未登录')
}
//routes 中使用
router.post('/new', loginCheck, async function (ctx, next) {
//只有登录验证通过了才会执行到这里
})