一、接口功能
1、接收接口返回参数
koa项目接口的制作,使用的是router的请求功能进行判断。
如下,我们的接口文件user.js
const Router = require('koa-router')
const router = new Router()
// 引入user模板
const User = require('../../modules/User')
/** *
* @route GET api/users/test
* @desc 测试接口地址
* @access 接口公开
* **/
router.get('/test',async ctx => {
ctx.status = 200
ctx.body = {msg: 'users works...'}
})
router.get('/test2',async ctx => {
ctx.status = 200
ctx.body = {
code: 200,
data: {
name: '李大宝',
sex: '男',
profession: '医生'
}
}
})
module.exports = router.routes()
在入口文件中,我们需要将接口文件安装上。
const Router = require('koa-router')
const router = new Router()
const users = require('./routes/api/users')
// 通过这个配置,我们可以得到user.js文件中两个接口,分别是/api/users/test,/api/users/test2
router.use('/api/users', users)
在postman中,我们请求一下接口,如图:
2、接口获取前端传递的参数
解析前端参数需要用到插件:koa-bodyparser // npm install koa-bodyparser —save
在入口文件app.js中使用koa-bodyparser
var Koa = require('koa')
var bodyParser = require('koa-bodyparser')
var app = new Koa()
// 注意!使用bodyParser()一定要在使用router中间件之前,否则获取的body为undefined
app.use(bodyParser())
在接口文件user.js中,查看接口请求参数:
// 在user.js接口中添加一个register接口如下
router.get('/register',async ctx => {
console.log(ctx.request.body)
})
postman如下:(Not Found是因为我们接口没有设置返回数据)
查看控制台,输出如下:
3、接口将获取到的前端参数存入数据库
我们有如下信息要存储入数据库:
{
name: ‘李大宝’,
sex: ‘男’,
phone: ‘17718511566’
}
在存储之前,我们需要先查询是否已经有个这个手机号(作为唯一标识),如果没有,则将数据存入数据库(我们用的mongoDB数据库)
①先查询数据是否已存储
在users.js文件中,我们引入模板数据(module中的User.js)
const User = require('../../modules/User')
然后查询:
router.post('/register', async ctx => {
const result = await User.find({phone: ctx.request.body.phone})
console.log(result) // result是一个数组
})
为了证明这个方法是好用的,我们现在mongoCompass中手动加入了一组数据:
{ “name”: “马桂芬”,
“sex”: “女”,
“phone”: “18201170363”
}
数据加入后,会自动生成oid:
接下来我们在postman中查一下马桂芬的手机号,控制台会输出马桂芬的信息如图:
如果输入一个数据库不存在的手机号,则数组为空,所以我们可以根据数据的长度去判断该user的数据是否已存在。
②数据存储
代码如下:
router.post('/register', async ctx => {
const result = await User.find({phone: ctx.request.body.phone})
if(result.length) {
ctx.status = 200
ctx.body = {
code: 500,
msg: '该用户已存在'
}
} else {
const { name, sex, phone} = ctx.request.body
const newUser = new User({
name,
sex,
phone
})
// 存储数据库
await newUser.save().then(user => {
ctx.body = user
}).catch(err => {
console.log(err)
})
// 返回json数据
ctx.body = newUser
}
})
postman发送数据后,去查看mongocompass:
我们看到李大宝的数据已经添加到数据库了。
mongo数据库的操作非常简单,以json数据形式存储,代码层面来说,操作起来非常简单!
③明文加密
在存储信息时候,很多特殊数据(比如密码)为了安全性,我们需要对数据进行加密存储,最常见的有md5加密。
插件:bcrypt.js // npm install bcryptjs —save
使用方法:
全部users.js接口文件如下:
**bcrypt.genSalt()这个方法本身就是异步方法
const Router = require('koa-router')
const router = new Router()
const bodyParser = require('koa-bodyparser')
const bcrypt = require('bcryptjs')
// 引入user模板
const User = require('../../modules/User')
/** *
* @route GET api/users/test
* @desc 测试接口地址
* @access 接口公开
* **/
router.get('/test',async ctx => {
ctx.status = 200
ctx.body = {msg: 'users works...'}
})
/** *
* @route GET api/users/register
* @desc 测试接口地址
* @access 接口公开
* **/
router.post('/register', async ctx => {
const result = await User.find({phone: ctx.request.body.phone})
if(result.length) {
ctx.status = 200
ctx.body = {
code: 500,
msg: '该用户已存在'
}
} else {
const { name, sex, phone, password} = ctx.request.body
let newUser = new User({
name,
sex,
phone
})
// 对password加密存储
//直接await不起作用用promise做包裹,将异步变为同步
/**await new Promise(function (resolve, reject) {
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(password, salt, (err, hash) => {
if (err) {
reject(err)
}
newUser.password = hash
resolve(newUser)
})
})
})**/
// 采用crypto提供的同步方法,更加优雅方便
const salt = bcrypt.genSaltSync(10)
const hash = bcrypt.hashSync(password, salt)
newUser.password = hash
await newUser.save().then(user => {
console.log('数据添加成功')
}).catch(err => {
console.log(err)
if(err) {throw err}
})
// 返回json数据
ctx.body = {
code: 200,
msg: '数据添加成功',
data: newUser
}
}
})
module.exports = router.routes()
④加密方法抽离
在config下简历tools.js文件
const bcrypt = require('bcryptjs')
const tools = {
enbcrypt(password) {
const salt = bcrypt.genSaltSync(10)
const hash = bcrypt.hashSync(password, salt)
return hash
}
}
module.exports = tools
在需要使用的文件中共引入:
const tools = require('../../config/tools')
const password = tools.enbcrypt(password)