一、接口功能
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 = 200ctx.body = {msg: 'users works...'}})router.get('/test2',async ctx => {ctx.status = 200ctx.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/test2router.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为undefinedapp.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 = 200ctx.body = {code: 500,msg: '该用户已存在'}} else {const { name, sex, phone} = ctx.request.bodyconst 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 = 200ctx.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 = 200ctx.body = {code: 500,msg: '该用户已存在'}} else {const { name, sex, phone, password} = ctx.request.bodylet 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 = hashresolve(newUser)})})})**/// 采用crypto提供的同步方法,更加优雅方便const salt = bcrypt.genSaltSync(10)const hash = bcrypt.hashSync(password, salt)newUser.password = hashawait 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)
