ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

搭建一个koa程序到实现接口

2021-12-12 11:34:19  阅读:155  来源: 互联网

标签:body const koa require ctx 接口 router 搭建


后端解析参数

1、初始化文件夹

npm init -y

2、安装koa和router

 npm install koa koa-router -S

3、安装启动命令

 npm install nodemon -D 

package.json  配置  "start": "nodemon app.js" 

{
  "name": "jiekolianxi",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "nodemon app.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "koa": "^2.13.4",
    "koa-body": "^4.2.0",
    "koa-router": "^10.1.1",
    "mongoose": "^6.1.1"
  },
  "devDependencies": {
    "nodemon": "^2.0.15"
  }
}

4、主程序的搭建

app.js

const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router();

router.get('/', ctx => {
  ctx.body = "Hello Koa !!!!"
})

app.use(router.routes()).use(router.allowedMethods());

app.listen(3000, () => {
  console.log('正在监听3000端口的服务')
})

5、配置子路由

./routers/users.js

const Router = require('koa-router');
const router = new Router({ prefix: '/users' });

router.get('/', ctx => {
  ctx.body = "我是用户列表"
})

router.get('/:id', ctx => {
  console.log(ctx.params.id)
  ctx.body = "获取某一个用户"
})

router.post('/', ctx => {
  ctx.body = "添加一个新的用户"
})

router.put('/:id', ctx => {
  ctx.body = "修改用户成功"
})

router.delete('/:id', ctx => {
  ctx.body = "删除用户成功"
})

module.exports = router.routes();

6、主程序添加子路由

const Koa = require('koa');
const Router = require('koa-router');
const usersRouter = require('./routers/users.js')
const app = new Koa();
const router = new Router();

router.get('/', ctx => {
  ctx.body = "Hello Koa !!!!"
})

router.use(usersRouter);
app.use(router.routes()).use(router.allowedMethods());

app.listen(3000, () => {
  console.log('正在监听3000端口的服务')
})

7、三种不用的传参的方式

query传参

调用接口

后端解析参数

router.get('/', ctx => {
  console.log(ctx.query.id)
  ctx.body = "我是用户列表"
})

params传参

调用接口

后端解析参数

router.get('/:id', ctx => {
  console.log(ctx.params.id)
  ctx.body = "获取某一个用户"
})

 body传参

image.png

router.post('/', ctx => {
  let { name, age } = ctx.request.body;
  console.log(name, age);
  ctx.body = "添加一个新的用户"
})

8、安装koa-body

 npm install koa-body -S

主程序需要添加

const koaBody = require('koa-body');

// 放在路由中间前面
app.use(koaBody());
router.use(usersRouter);
app.use(router.routes()).use(router.allowedMethods());

 9、控制层controllers

./controller/usersControllers.js

// 获取用户列表
const getUserList = (ctx) => {
  console.log(ctx.query.id)
  ctx.body = "我是用户列表"
}

// 获取某一个用户
const getUser = (ctx) => {
  console.log(ctx.params.id)
  ctx.body = "获取某一个用户"
}

// 新增一个用户
const createUser = (ctx) => {
  let { name, age } = ctx.request.body;
  console.log(name, age);
  ctx.body = "添加一个新的用户"
}

// 修改一个用户
const updateUser = (ctx) => {
  ctx.body = "修改用户成功"
}

// 删除一个用户
const deleteUser = (ctx) => {
  ctx.body = "删除用户成功"
}

module.exports = {
  getUserList,
  getUser,
  createUser,
  updateUser,
  deleteUser
}

10、连接数据库

1.用cmd命令以管理员身边运行 mongodb  

   输入 net start mongodb 

2.连接 MongoDB 的地址

Mongoose 5.0 中文文档http://www.mongoosejs.net/docs/index.html或者  使用 

const Koa = require('koa');
const Router = require('koa-router');
const koaBody = require('koa-body');
const mongoose = require('mongoose');
const usersRouter = require('./routers/users.js')

mongoose.connect('mongodb://localhost/admin');
var db = mongoose.connection;
db.on('error', console.error.bind(console, '连接失败!!!'));
db.once('open', function () {
  console.log('连接成功!!!')
});

11.接口实现

     重点纪要

  1. 我们在Schema中给密码、__V设置了select :false,在之后find、findById、findOne在数据库查找返回的数据不会再带上select : false的字段。
  2. 因为我们传id的方式都是用的restful风格的接口,所以我们需要用ctx.params.id来获取
  1. findByIdAndUpdate 这个查找方法分两个参数,第一个是id,后面是需要修改的字段,不需要修改的字段可以不传,这个方法会帮我们自动处理,没有传的参数保持原数据。

       新建Schema

    ./models/usersSchema.js

const mongoose = require('mongoose');
const { Schema, model } = mongoose;

const usersSchema = new Schema({
  __v: { type: String, select: false },
  name: { type: String, required: true },
  email: { type: String, default: '' },
  password: { type: String, required: true, select: false },
  date: { type: Date, default: Date.now } // 注册时间
})

module.exports = model('Users', usersSchema)

控制层Controllers

usersControllers.js

const Users = require('../models/usersSchema.js')

// 获取用户列表
const getUserList = async ctx => {
  ctx.body = await Users.find();
}

// 获取某一个用户
const getUser = async ctx => {
  console.log(ctx.params.id)
  const user = await Users.findById(ctx.params.id);
  if (!user) {
    ctx.throw(404, '用户不存在')
  }
  ctx.body = user
}

// 新增一个用户
const createUser = async ctx => {
  let { name } = ctx.request.body;
  const user = await Users.findOne({ name });
  if (user) {
    ctx.throw(405, '已存在该用户!!!')
  } else {
    ctx.body = await new Users(ctx.request.body).save();
  }
}

// 修改一个用户
const updateUser = async ctx => {
  let { id } = ctx.params
  const user = await Users.findByIdAndUpdate(id, ctx.request.body);
  if (!user) { ctx.throw(404, '用户不存在!!!') }
  ctx.status = 200
  ctx.body = { msg: '修改成功' }
}

// 删除一个用户
const deleteUser = async ctx => {
  let { id } = ctx.params
  const user = await Users.findByIdAndDelete(id);
  if (!user) { ctx.throw(404, '用户不存在!!!') }
  ctx.status = 200
  ctx.body = { msg: '删除成功' }
}

module.exports = {
  getUserList,
  getUser,
  createUser,
  updateUser,
  deleteUser
}

12、调用接口的方式

        获取用户列表

图片.png

        获取某一个用户 

        传入一个用户id

         添加一个新用户 

        body里面添加用户信息

图片.png

        修改一个用户 

        可以只传自己需要修改的字段,id还是在地址栏上传的,这一点需要注意

       删除一个用户

        传入一个id

13、图片上传

1、 文件位置 

./routers/uploads.js

const path = require('path');
const Router = require('koa-router');
const router = new Router({ prefix: "/uploads" });

/**
 * @route GET api/uploads
 * @desc 测试接口地址
 * @access 接口是公开的
 */
router.post('/', ctx => {
  const file = ctx.request.files.file;
  const basename = path.basename(file.path);
  ctx.body = { url: `${ctx.origin}/uploads/${basename}` };
})


module.exports = router.routes();

2、需要下载 koa-static

npm install koa-static

 要创建一个public 目录 里面 创建一个 uploads文件

const Koa = require('koa');
const Router = require('koa-router');
const koaBody = require('koa-body');
const KoaStatic = require('koa-static')
const path = require('path')
const mongoose = require('mongoose');
const usersRouter = require('./routers/users.js')
const uploadsRouter = require('./routers/uploads.js')

mongoose.connect('mongodb://localhost/admin');
var db = mongoose.connection;
db.on('error', console.error.bind(console, '连接失败!!!'));
db.once('open', function () {
  console.log('连接成功!!!')
});

const app = new Koa();
const router = new Router();

router.get('/', ctx => {
  ctx.body = "Hello Koa !!!!"
})
// 静态资源访问的功能
app.use(KoaStatic(path.join(__dirname, 'public')))

app.use(koaBody({
  multipart: true,
  formidable: {
    uploadDir: path.join(__dirname, '/public/uploads'),
    keepExtensions: true
  }
}));

router.use(uploadsRouter);
router.use(usersRouter);
app.use(router.routes()).use(router.allowedMethods());

app.listen(3000, () => {
  console.log('正在监听3000端口的服务')
})

标签:body,const,koa,require,ctx,接口,router,搭建
来源: https://blog.csdn.net/m0_61417250/article/details/121883463

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有