数据验证
在express 中可以使用 express-validator
的中间件去对数据进行格式验证处理,在koa 中我们可以使用 joi
,其实这个无关框架,在express 中也是可以用的
尝试使用他来写一个 注册数据验证的中间件
const { User } = require('../model/index')
const Joi = require('joi')
module.exports.registerValidate = async (ctx, next) => {
const schema = Joi.object({
username: Joi.string().required(),
password: Joi.string().min(6).required(),
email: Joi.string().email().required(),
phone: Joi.required()
}).validate(ctx.request.body)
if (schema.error) {
ctx.throw(400, schema.error) // 直接向客户端抛出默认报错
}
const emailValidate = await User.findOne({email:ctx.request.body.email})
if(emailValidate){
ctx.throw(400,'邮箱已经被注册')
}
// console.log(schema);
await next()
}
router/index.js
const { registerValidate, loginValidate } = require('../middleware/userValdate')
//...
router.post('/user/register', registerValidate, userController.register)
JWT
npm install jsonwebtoken
utils/jwt.js
const jwt = require('jsonwebtoken')
const { promisify } = require('util')
const tojwt = promisify(jwt.sign)
const verify = promisify(jwt.verify)
// 验证token
module.exports.verifyToken = function (required = true) {
return async (ctx, next) => {
var token = ctx.headers.authorization
token = token ? token.split("Bearer ")[1] : null
if(token){
try {
var userInfo = await verify(token,'koa-viode')
ctx.user = userInfo
await next()
} catch (error) {
ctx.throw(402,error)
}
}else if(required){
ctx.throw(402,'无效的token')
}else{
await next()
}
}
}
// 生成token
module.exports.createToken = async userInfo => {
var token = await tojwt({ userInfo }, 'koa-viode', {
expiresIn: 60 * 60 * 24
})
return token
}
在登陆时创建token
const { User, Subscribe } = require('../model')
const { createToken } = require('../util/jwt')
// 用户登录
module.exports.login = async ctx => {
var dbback = await User.findOne(ctx.request.body)
if (!dbback) {
return ctx.throw(402, "邮箱或者密码不正确")
}
var token = await createToken(dbback._doc)
dbback._doc.token = token
ctx.body = dbback._doc
}
在其他接口种验证token:
router/index.js
const { verifyToken } = require('../util/jwt')
//....
router.get('/user/getuser/:userid', verifyToken(false), userController.getuser)
router.get('/user/subscribe/:subscribeid', verifyToken(true), userController.subscribe)
router.get('/user/subscribelist', verifyToken(true), userController.subscribeList)