一、接口功能

1、接收接口返回参数

koa项目接口的制作,使用的是router的请求功能进行判断。
如下,我们的接口文件user.js

  1. const Router = require('koa-router')
  2. const router = new Router()
  3. // 引入user模板
  4. const User = require('../../modules/User')
  5. /** *
  6. * @route GET api/users/test
  7. * @desc 测试接口地址
  8. * @access 接口公开
  9. * **/
  10. router.get('/test',async ctx => {
  11. ctx.status = 200
  12. ctx.body = {msg: 'users works...'}
  13. })
  14. router.get('/test2',async ctx => {
  15. ctx.status = 200
  16. ctx.body = {
  17. code: 200,
  18. data: {
  19. name: '李大宝',
  20. sex: '男',
  21. profession: '医生'
  22. }
  23. }
  24. })
  25. module.exports = router.routes()

在入口文件中,我们需要将接口文件安装上。

  1. const Router = require('koa-router')
  2. const router = new Router()
  3. const users = require('./routes/api/users')
  4. // 通过这个配置,我们可以得到user.js文件中两个接口,分别是/api/users/test,/api/users/test2
  5. router.use('/api/users', users)

在postman中,我们请求一下接口,如图:
image.png

2、接口获取前端传递的参数

解析前端参数需要用到插件:koa-bodyparser // npm install koa-bodyparser —save

在入口文件app.js中使用koa-bodyparser

  1. var Koa = require('koa')
  2. var bodyParser = require('koa-bodyparser')
  3. var app = new Koa()
  4. // 注意!使用bodyParser()一定要在使用router中间件之前,否则获取的body为undefined
  5. app.use(bodyParser())

在接口文件user.js中,查看接口请求参数:

  1. // 在user.js接口中添加一个register接口如下
  2. router.get('/register',async ctx => {
  3. console.log(ctx.request.body)
  4. })

postman如下:(Not Found是因为我们接口没有设置返回数据)
image.png

查看控制台,输出如下:
image.png

3、接口将获取到的前端参数存入数据库

我们有如下信息要存储入数据库:
{
name: ‘李大宝’,
sex: ‘男’,
phone: ‘17718511566’
}

在存储之前,我们需要先查询是否已经有个这个手机号(作为唯一标识),如果没有,则将数据存入数据库(我们用的mongoDB数据库)

①先查询数据是否已存储

在users.js文件中,我们引入模板数据(module中的User.js)

  1. const User = require('../../modules/User')
  1. 然后查询:
  1. router.post('/register', async ctx => {
  2. const result = await User.find({phone: ctx.request.body.phone})
  3. console.log(result) // result是一个数组
  4. })

为了证明这个方法是好用的,我们现在mongoCompass中手动加入了一组数据:
{ “name”: “马桂芬”,
“sex”: “女”,
“phone”: “18201170363”
}

image.png

数据加入后,会自动生成oid:
image.png

接下来我们在postman中查一下马桂芬的手机号,控制台会输出马桂芬的信息如图:
image.png

  1. 如果输入一个数据库不存在的手机号,则数组为空,所以我们可以根据数据的长度去判断该user的数据是否已存在。

②数据存储

代码如下:

  1. router.post('/register', async ctx => {
  2. const result = await User.find({phone: ctx.request.body.phone})
  3. if(result.length) {
  4. ctx.status = 200
  5. ctx.body = {
  6. code: 500,
  7. msg: '该用户已存在'
  8. }
  9. } else {
  10. const { name, sex, phone} = ctx.request.body
  11. const newUser = new User({
  12. name,
  13. sex,
  14. phone
  15. })
  16. // 存储数据库
  17. await newUser.save().then(user => {
  18. ctx.body = user
  19. }).catch(err => {
  20. console.log(err)
  21. })
  22. // 返回json数据
  23. ctx.body = newUser
  24. }
  25. })

postman发送数据后,去查看mongocompass:
image.png

我们看到李大宝的数据已经添加到数据库了。
mongo数据库的操作非常简单,以json数据形式存储,代码层面来说,操作起来非常简单!

③明文加密

在存储信息时候,很多特殊数据(比如密码)为了安全性,我们需要对数据进行加密存储,最常见的有md5加密。

插件:bcrypt.js // npm install bcryptjs —save

使用方法:
全部users.js接口文件如下:

**bcrypt.genSalt()这个方法本身就是异步方法

  1. const Router = require('koa-router')
  2. const router = new Router()
  3. const bodyParser = require('koa-bodyparser')
  4. const bcrypt = require('bcryptjs')
  5. // 引入user模板
  6. const User = require('../../modules/User')
  7. /** *
  8. * @route GET api/users/test
  9. * @desc 测试接口地址
  10. * @access 接口公开
  11. * **/
  12. router.get('/test',async ctx => {
  13. ctx.status = 200
  14. ctx.body = {msg: 'users works...'}
  15. })
  16. /** *
  17. * @route GET api/users/register
  18. * @desc 测试接口地址
  19. * @access 接口公开
  20. * **/
  21. router.post('/register', async ctx => {
  22. const result = await User.find({phone: ctx.request.body.phone})
  23. if(result.length) {
  24. ctx.status = 200
  25. ctx.body = {
  26. code: 500,
  27. msg: '该用户已存在'
  28. }
  29. } else {
  30. const { name, sex, phone, password} = ctx.request.body
  31. let newUser = new User({
  32. name,
  33. sex,
  34. phone
  35. })
  36. // 对password加密存储
  37. //直接await不起作用用promise做包裹,将异步变为同步
  38. /**await new Promise(function (resolve, reject) {
  39. bcrypt.genSalt(10, (err, salt) => {
  40. bcrypt.hash(password, salt, (err, hash) => {
  41. if (err) {
  42. reject(err)
  43. }
  44. newUser.password = hash
  45. resolve(newUser)
  46. })
  47. })
  48. })**/
  49. // 采用crypto提供的同步方法,更加优雅方便
  50. const salt = bcrypt.genSaltSync(10)
  51. const hash = bcrypt.hashSync(password, salt)
  52. newUser.password = hash
  53. await newUser.save().then(user => {
  54. console.log('数据添加成功')
  55. }).catch(err => {
  56. console.log(err)
  57. if(err) {throw err}
  58. })
  59. // 返回json数据
  60. ctx.body = {
  61. code: 200,
  62. msg: '数据添加成功',
  63. data: newUser
  64. }
  65. }
  66. })
  67. module.exports = router.routes()

④加密方法抽离

在config下简历tools.js文件

  1. const bcrypt = require('bcryptjs')
  2. const tools = {
  3. enbcrypt(password) {
  4. const salt = bcrypt.genSaltSync(10)
  5. const hash = bcrypt.hashSync(password, salt)
  6. return hash
  7. }
  8. }
  9. module.exports = tools

在需要使用的文件中共引入:

  1. const tools = require('../../config/tools')
  2. const password = tools.enbcrypt(password)