# 前端:vue3+ts,后端:koa2+jwt,实现登陆功能(后端部分上篇)
1. 在routes里面,创建一个user.js文件,用作登陆的后端文件
/**
* 用户管理模块
*/
const router = require('koa-router')() // koa路由文件
const User = require('../models/userSchema') // schema文件 定义user用户的字段的
const util = require('../utils/util') // 引入请求成功与否的封装
const jwt = require('jsonwebtoken') // 引入jsonwebtoken做token的加密
// 二级路由前缀定义
router.prefix('/users')
// 用户的登录
router.post('/login', async (ctx) => {
try {
// get请求是ctx.request.query
// post请求是ctx.request.body
const { username, password } = ctx.request.body
/**
* 返回数据库指定字段, 有三种方式
* 1. 'userId username userEmail state role deptId roleList' // 选择只返回的字段
* 2. { userId: 1, _id: 0 } // 选择只返回的字段, 1是展示, 0是不展示
* 3. selec('userId') // 查找userId
*/
const res = await User.findOne({
username,
password
}, 'userId userame userEmail state role deptId roleList')
const data = res._doc##
// 利用jsonwebtoken生成基于密钥xiaohe的token
const token = jwt.sign({
data,
}, 'xiaohe', { expiresIn: '2d' })
// 当查找到数据的时候,返回token和成功
if(res) {
data.token = token
ctx.body = util.success(data)
} else {
ctx.body = util.fail('账号或密码不正确')
}
} catch (error) {
// console.log(error)
ctx.body = util.fail(error.msg)
}
})
2. 挂载一下到app.js里面
const Koa = require('koa')
const app = new Koa()
const views = require('koa-views')
const json = require('koa-json')
const onerror = require('koa-onerror')
const bodyparser = require('koa-bodyparser')
const logger = require('koa-logger')
const koajwt = require('koa-jwt') // 引入koa-jwt,用于解密
const users = require('./routes/users') // 引入users文件
const log4js = require('./utils/log4j') // 引入日志系统
const router = require('koa-router')() // 引入路由跳转
const util = require('./utils/util') // 引入状态吗
// error handler
onerror(app)
// 使用db连接数据库
require('./config/db')
// middlewares
app.use(bodyparser({
enableTypes:['json', 'form', 'text']
}))
app.use(json())
app.use(logger())
app.use(require('koa-static')(__dirname + '/public'))
app.use(views(__dirname + '/views', {
extension: 'pug'
}))
// logger 中间件
app.use(async (ctx, next) => {
log4js.info(`get: ${ JSON.stringify(ctx.request.query) }`)
log4js.info(`params: ${ JSON.stringify(ctx.request.body) }`)
// 当状态码是401的时候,改成200,并展示token认证失败
await next().catch(err => {
if(err.status == '401') {
ctx.status = 200
ctx.body = util.fail('Token认证失败', util.CODE.AUTH_ERROR)
} else throw err
})
})
// koa的jwt校验, secret: 密钥 unless:过滤掉不需要校验的api
app.use(koajwt({ secret: 'xiaohe' }).unless({
path: [/^\/api\/users\/login/]
})) // 密钥校验,jwt校验
router.prefix('/api') // api前缀
// 挂载users上路由
router.use(users.routes(), users.allowedMethods())
// routes
app.use(router.routes(), router.allowedMethods())
// error-handling
app.on('error', (err, ctx) => {
// console.error('server error', err, ctx)
log4js.error(`${ err.stack }`)
});
module.exports = app
最后
公众号:小何成长,佛系更文,都是自己曾经踩过的坑或者是学到的东西
有兴趣的小伙伴欢迎关注我哦,我是:
何小玍
。大家一起进步鸭需要源码的,欢迎添加公众号,然后跟我要源码吧。
最近有点忙,文章可能有点水,有问题大家可以关注我公众号,一起交流
注释都写到代码里面了,望见谅