koa2脚手架中:
下载
cnpm i -S koa-jwt jsonwebtoken
config/settings.js:
let options_mysql = {
host: 'localhost', //默认localhost
user: 'root', //mysql用户名
password: 'root', //mysql密码
database: 'test' //数据库名
}
let options_jwt = {
jwt_key: 'jwt_key', //jwt密钥
expiresIn: 5, //5秒后过期
pathNoAuth: ['/login'] //无须校验的路径
}
module.exports = {
options_mysql, options_jwt
}
db.js:
// db.js
var mysql = require('mysql');
const { options_mysql } = require('./config/settings')
var pool = mysql.createPool({
host: options_mysql.host,
user: options_mysql.user,
password: options_mysql.password,
database: options_mysql.database
});
function query(sql) {
return new Promise((resolve, reject) => {
pool.getConnection(function (err, connection) {
connection.query(sql, function (err, result) {
if (err) {
reject(err)
} else {
resolve(result)
}
connection.release();
});
});
})
}
exports.query = query;
app.js:
const koajwt = require('koa-jwt');
let { options_jwt } = require("./config/settings.js")
// 中间件对token进行验证
app.use(async (ctx, next) => {
return next().catch((err) => {
if (err.status === 401) {
ctx.body = {
code: 401,
message: err.message
}
} else {
throw err;
}
})
});
app.use(koajwt({ secret: options_jwt.jwt_key }).unless({
path: options_jwt.pathNoAuth
}));
注意:上面的内容尝试使用以下的方式:
app.use(async (ctx, next) => { return await next().catch((err) => { if (err.status === 401) { return ctx.body = { code: 401, message: "身份验证失败" } } throw err; }) });
routes/index.js:
const router = require('koa-router')()
const db = require("../db.js")
let jwt = require('jsonwebtoken')
let { options_jwt } = require("../config/settings.js")
router.get('/', async (ctx, next) => {
await ctx.render('index', {
title: 'Hello Koa 2!'
})
})
router.get('/string', async (ctx, next) => {
ctx.body = 'koa2 string'
})
router.get('/json', async (ctx, next) => {
ctx.body = {
title: 'koa2 json'
}
})
router.post('/login', async (ctx, next) => {
let { username, password } = ctx.request.body
if (!username) {
ctx.body = { code: -1, message: '用户名不能为空' }
return
}
let users = await db.query(`select * from users where username='${username}'`);
if (users.length == 0) {
ctx.body = {
code: -1,
message: '该用户不存在'
}
return
}
// if (users[0].password !== md5(password)) {
if (users[0].password !== password) {
ctx.body = {
code: -1,
message: '密码错误!'
}
return
}
let token = jwt.sign({ username, id: users[0].id }, options_jwt.jwt_key, {
expiresIn: options_jwt.expiresIn
});
ctx.body = {
code: 0,
message: '登录成功',
token
}
})
module.exports = router
routes/users.js
const router = require('koa-router')()
const db = require("../db.js")
router.prefix('/users')
router.get('/', function (ctx, next) {
ctx.body = 'this is a users response!'
})
router.get('/bar', function (ctx, next) {
ctx.body = 'this is a users/bar response'
})
router.get('/getUserInfo', async (ctx, next) => {
let userinfo = ctx.state.user
let users = await db.query(`select * from users where username='${userinfo.username}'`);
let { username, id } = users[0]
ctx.body = {
code: 0,
message: "success",
data: { username, id }
}
})
module.exports = router