vue3+node(koa2)写一个网站(二)-node篇

使用koa2框架来开发,使用方式如下:
npm install koa-generator -g
koa2 project-name
cd project-name
npm install

然后npm run dev就可以跑起来了。

1.其他环境的搭建

需要安装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
}

2.项目中使用mysql

先 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)
}

3.项目中使用session 和redis

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('登陆失败');
  }
})

4.中间件的使用

某种特定的会重复使用的功能,我们一般会写成中间件来重复使用。

//一个登录中间件  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) {
  //只有登录验证通过了才会执行到这里
})

 

你可能感兴趣的:(node)