Koa学习2:路由与数据库连接

news2025/1/12 23:36:53

路由

安装

npm i koa-router

基本功能

  1. 定义路由:koa-router提供了一种简单的方式来定义路由,我们可以根据请求的方法和路径来定义不同的路由。

  2. 处理请求:koa-router可以帮助我们处理请求,当请求匹配到对应的路由时,koa-router会调用我们定义的处理函数来处理请求。

  3. 中间件支持:koa-router支持使用中间件来处理请求,我们可以在路由处理函数中使用中间件来实现一些通用的功能,如身份验证、日志记录等。

  4. 参数解析:koa-router可以帮助我们解析URL中的参数,我们可以在路由路径中定义参数,然后在处理函数中使用这些参数。

基本步骤
1、导入包

const Router = require('koa-router')

2、实例化对象

const indexRouter = new Router()
const userRouter = new Router();

3、编写路由

indexRouter.get('/',(ctx,next)=>{
  ctx.body = 'index.html'
})
userRouter.get('/user', (ctx, next) => {
  ctx.body = 'user.html';
});

3、注册中间件

// 中间件,加载indexRouter和userRouter下的所有路由
app.use(indexRouter.routes()).use(userRouter.routes());

路由拆分
为了避免所有的内容都写着main.js里导致后期不好维护,可以单独定义一个router目录来存放路由文件

user.route.js

// 加载路由模块
const Router = require('koa-router');
// 实例化
const router = new Router({
  // 统一的前缀
  prefix: '/users',
});

// 相当于 /users/
router.get('/', (ctx, next) => {
  ctx.body = 'hello users';
});

//导出
module.exports = router;

main.js

// 导入Koa
const Koa = require('koa');
// 导入环节变量
const { APP_PORT } = require('./src/config/config.default');
// 导入路由
const userRouter = require('./src/router/user.route');

// 实例化
const app = new Koa();

// 中间件
app.use(userRouter.routes());

// 监听端口
app.listen(APP_PORT, () => {
  console.log(`app listening at http://localhost${APP_PORT}`);
});

目录优化

app目录

src目录下创建一个app目录,用来存放与业务相关的代码
app/index.js

// 导入Koa
const Koa = require('koa');
// 导入路由
const userRouter = require('../router/user.route');
// 实例化
const app = new Koa();
// 中间件
app.use(userRouter.routes());
module.exports = app;

main.js

// 导入环节变量
const { APP_PORT } = require('./src/config/config.default');
// 导入app
const app =require('./src/app/index')

// 监听端口
app.listen(APP_PORT, () => {
  console.log(`app listening at http://localhost${APP_PORT}`);
});

controller目录
src目录下创建一个controller目录,作为控制层,用来提取路由里的业务方法

user.controller

/**
 * 处理与用户有关的请求
 */

class UserController {
  //注册
  async register(ctx, next) {
    ctx.body = '用户注册';
  }
}

// 导出实例化对象
module.exports = new UserController();

user.route.js

// 加载路由模块
const Router = require('koa-router');
// 导入 controller
const { register } = require('../controller/user.controller.js');
// 实例化
const router = new Router({
  // 统一的前缀
  prefix: '/users',
});

// 注册
router.post('/register', register);

//导出
module.exports = router;

post请求可以使用 Apifox 工具

解析body

这里使用中间件koa-body,使用koa-body中间件后,请求体的参数会被写入到ctx.request.body

安装

npm i koa-body

注册
app/index.js

// 导入Koa
const Koa = require('koa');
// 导入 koa-body
const { koaBody } = require('koa-body');
// 导入路由
const userRouter = require('../router/user.route');

// 实例化
const app = new Koa();
// koa-body中间件要在所有的路由之前
app.use(koaBody());

// 中间件
app.use(userRouter.routes());

module.exports = app;

修改register函数

  //注册
  async register(ctx, next) {
    ctx.body = ctx.request.body;
  }

在这里插入图片描述

拆分service层

async register(ctx, next) {
  // 1、获取数据
  const requistBidy = ctx.request.body
  // 2、操作数据库

  // 3、返回响应结果
  ctx.body = ctx.request.body;
}

基本上操作流程就是上面的3个步骤,有时候为了避免操作数据库的代码过多,因此会单独拆分成一个service层来存放这些代码

src目录下创建service目录,用来存放数据库操作的代码

src/service/user.service.js

class UserService {
  // 创建用户
  async createUser(user_name, password) {
    return '写入数据库成功';
  }
}

// 导出
module.exports = new UserService();

user.controller.js

//导入service
const { createUser } = require('../service/user.service');

//注册
async register(ctx, next) {
 // 1、获取数据
 const requistBody = ctx.request.body;
 // 2、操作数据库
 const res = await createUser(requistBody.user_name, requistBody.password);
 // 3、返回响应结果
 ctx.body = res;
}

在这里插入图片描述

总结

  • 路由层:用来管理路由,指定哪一个接口应该执行哪一个方法。一般一个模块放在一个路由文件里
  • controller层:用来管理路由请求的具体方法。通常一个模块对应一个文件,一个文件里有一个对应的类,类里面的每一个方法对应一个接口
  • service层:正常关于数据库的操作可以写在controller层,但是为了避免方法里代码过多不好管理,会将对数据库的操作抽取到service层

数据库连接

mysql安装设置

可以参考:mysql安装,是通过安装php集成环境来实现的。

数据库连接

视频教程中使用了Sequelize,这里我们也跟着使用Sequelize

官方网站:https://www.sequelize.cn/

Sequelize是一个Node.js ORM(Object-Relational Mapping)框架,它提供了一种操作关系型数据库的方式,使得开发者可以使用JavaScript语言来操作数据库,而不需要直接使用SQL语句。Sequelize支持多种数据库,包括MySQL、PostgreSQL、SQLite和Microsoft SQL Server等。使用Sequelize可以方便地进行数据库的增删改查操作,同时也提供了一些高级功能,如事务处理、数据验证、关联查询等。

ORM对象关系映射:

  • 数据表映射对应一个类
  • 数据表中的数据行对应一个对象
  • 数据表字段对应对象的属性
  • 数据表的操作对应对象的方法

安装

// 安装Sequelize
npm i sequelize
// 安装数据库驱动,这里使用mysql
npm i mysql2

连接数据库

src目录下创建db/seq.js

// 导入sequelize
const  Sequlize  = require('sequelize');

// 实例化对象
const sequelize = new Sequlize(
  // 数据库名称
  'test',
  // 账户
  'root',
  // 密码
  '123456',
  // 其他
  {
    // 主机地址
    host: 'localhost',
    // 数据库类型
    dialect: 'mysql',
  }
);

// 测试数据库的连接
sequelize
  .authenticate()
  .then(() => {
    console.log('数据库连接成功.');
  })
  .catch((error) => {
    console.error('数据库连接失败:', error);
  });

在这里插入图片描述
优化
将数据库信息抽取到env文件中

.env

# 监听的端口
APP_PORT = 3000

# mysql主机地址、端口、用户、密码、数据库
MYSQL_HOST = localhost
MYSQL_POST = 3306
MYSQL_USER = root
MYSQL_PWD  = 123456
MYSQL_DB   = test

seq.js

// 导入sequelize
const Sequlize = require('sequelize');
// 导入数据库配置信息
const {
  MYSQL_HOST,
  MYSQL_POST,
  MYSQL_USER,
  MYSQL_PWD,
  MYSQL_DB,
} = require('../config/config.default');

// 实例化对象
const sequelize = new Sequlize(MYSQL_DB, MYSQL_USER, MYSQL_PWD, {
  host: MYSQL_HOST,
  post: MYSQL_POST,
  dialect: 'mysql',
});

// 测试数据库的连接
sequelize
  .authenticate()
  .then(() => {
    console.log('数据库连接成功.');
  })
  .catch((error) => {
    console.error('数据库连接失败:', error);
  });

// 导出

module.exports = sequelize;

在这里插入图片描述

注意

  • 你要在项目根目录下运行,不要跑到具体的文件夹里运行,否则.env文件里的变量无法加载
  • .env 文件中 # 是注释符号,如果你定义的变量值(字符串)里有这个符合,那么必须要加上引号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能轨道交通行业周刊-第47期(2023.5.29-6.4)

本期关键词:郑州智慧地铁、货运安全监控、激光炮、6C系统、越行站、ChatGPT原理 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨…

SparkSQL文件格式和压缩算法是否支持Split

大数据支持Split的目的是为了能并行处理任务,可以将文件拆分成多个文件块处理。如果不支持Split的话,只能用一个任务处理单个文件。 能否支持Split受到文件格式和压缩算法的双重限制,大部分文件的读取都是可以支持Split,极少数压缩…

每日学术速递5.29

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Custom-Edit: Text-Guided Image Editing with Customized Diffusion Models(CVPR 2023) 标题:自定义编辑:使用自定义扩散模型进行文本引导图像编辑 作者&a…

部署rabbitmq3.10.6详细步骤

RabbitMQ简介 RabbitMQ是Erlang开发的,集群非常方便,因为Erlang天生就是分布式语言,但其本身并不支持负载均衡,支持高并发,支持可扩展。支持AJAX,持久化,用于在分布式系统中存储转发消息&#x…

八、Git分支和版本号的简介

1、Git分支介绍 分支在Git中相对较难,分支就是科幻电影里面的平行宇宙,如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,我们就需要处理一些问题了! 2…

【AI绘图】一、stable diffusion的发展史

一、stable diffusion的发展史 本文目标:学习交流 对于熟悉SD的同学,一起学习和交流使用过程中的技巧和心得。 帮助新手 帮助没有尝试过SD但又对它感兴趣的同学快速入门,并且能够独立生成以上效果图。 1.发展史介绍: 2015年的时候…

汇编重复计算之使用循环与不循环使用区别

没有使用循环的汇编代码,计算ffff:0-ffff:b的累加之和 assume cs:code 表示code段与CS寄存关联 code segment 表示段开始 ,code ends表示段结束,end表示汇编程序结束 mov ax,0ffffh 表示将ffffh送入ax寄存器 mov ds,ax 表示将ax寄存器值送入ds寄存器 mov …

第二十四章 开发Productions - ObjectScript Productions - 定义业务服务

文章目录 第二十四章 开发Productions - ObjectScript Productions - 定义业务服务介绍关键原则定义业务服务类实施 OnProcessInput() 方法 第二十四章 开发Productions - ObjectScript Productions - 定义业务服务 本页介绍如何定义业务服务类。 提示: IRIS 提供…

高完整性系统 (2):Requirement 与 Design 阶段的风险控制——Hazards, HAZOP, Fault Tree

文章目录 安全性工程流程Hazards反事实推理(CounterFactual Reasoning)案例1案例2案例3 HAZOP: HAZARDS AND OPERABILITY STUDY案例1HAZOP 工作流程HAZOP 总结 Fault Tree AnalysisFault Tree 定义案例Node Symbolsanalysis outcomes 这节课主要介绍了高…

【Linux集锦01】CentOS的安装

Centos的安装 1.创建新的虚拟机2. 自定义3.下一步4.创建虚拟空白光盘5.安装Linux系统和Centos 7 发行版6.命名虚拟机名称和选择磁盘位置7.处理器配置 主要看自己的电脑的情况8.设置虚拟机内存9.网络设置 nat10.选择IO控制器类型11.选择磁盘类型12.创建新虚拟磁盘13.设置磁盘容量…

【MyBatis】2、MyBatis 的动态 SQL 和增删改操作

目录 一、添加(1) 基本插入(2) 设置新插入记录的主键&#xff08;id&#xff09;★ 二、更新三、删除四、动态 SQL(1) if 标签(2) where 标签(3) foreach 标签 五、起别名六、sql 标签七、在 MyBatis 中集成 druid 连接池 一、添加 (1) 基本插入 <mapper namespace"s…

qtcanpool 知 99:常见问题

文章目录 前言问题构建 fancydemo 报链接库错误 后语 前言 qtcanpool 是根据 qtcreator 整理出的一套通用的工程管理模板&#xff0c;同时集成一些常见的库和插件。就像 qtcanpool 名字一样&#xff0c;它是一个 qt 池&#xff0c;用户可以从中汲取所需。 对于初次使用 qtcan…

iPad触屏笔哪个牌子好用?平替电容笔推荐

电容笔可以说是人手必备的数码产品&#xff0c;市面上的电容笔品牌数不胜数&#xff0c;很多人都快赶不上它的步伐了&#xff0c;新品的大批量上升&#xff0c;说明市场上的电容笔的需求量日益扩大&#xff0c;越来越多人在学习上、办公上等使用&#xff0c;作为资深的电容笔发…

Kafka重平衡rebalance是什么

重平衡 背景&#xff1a; 假如你是一家公司的老板&#xff0c;手下有三名员工张三、李四、王五&#xff0c;现在你有三项工作A、B、C&#xff0c;正好安排给三人。 过了一个月后&#xff0c;员工王五离开了公司。这个时候只剩下两名员工&#xff0c;你只能把原先王五安排的…

每日学术速递6.3

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Reconstructing the Minds Eye: fMRI-to-Image with Contrastive Learning and Diffusion Priors 标题&#xff1a;重建心灵之眼&#xff1a;fMRI-to-Image with Contrastive lear…

反向ajax实现

在过去的几年中&#xff0c;web开发已经发生了很大的变化。现如今&#xff0c;我们期望的是能够通过web快速、动态地访问应用。在这一新的文章系列中&#xff0c;我们学习如何使用反 向Ajax&#xff08;Reverse Ajax&#xff09;技术来开发事件驱动的web应用&#xff0c;以此来…

【Android开发基础】更新\修改Adapter适配器数据(例:聊天功能等)

文章目录 一、引言二、解决方案1、需求一2、需求二&#xff08;1&#xff09;普通方法&#xff08;2&#xff09;观察者模式&#xff08;推荐&#xff09; 一、引言 描述&#xff1a;如何在主线程&#xff08;Activity/Fragment&#xff09;UI中修改子线程&#xff08;Adapter…

小白可以看懂的「GraphQL」,GraphQL到底是啥样

GraphQL是一种用于API的查询语言&#xff0c;可以在服务端定义GraphQL Schema&#xff0c;客户端可以向服务端发送GraphQL请求&#xff0c;服务端执行GraphQL查询&#xff0c;并将结果作为JSON返回给客户端。 下面是一个使用golang实现GraphQL的示例&#xff0c;首先需要安装g…

Ajax请求与浏览器缓存

在现代Web应用程序中&#xff0c;前端代码充斥着大量的Ajax请求&#xff0c;如果对于Ajax请求可以使用浏览器缓存&#xff0c;那么可以显著地减少网络请求&#xff0c;提高程序响应速度。 1. Ajax Request 使用jQuery框架可以很方便的进行Ajax请求&#xff0c;示例代码如下&a…

RISC-V 学习篇之特权架构下的中断异常处理

RISC-V 学习篇之特权架构下的中断异常处理 控制流和Trap特权架构简单的嵌入式系统的机器模式机器模式下的异常处理mtvec&#xff08;Machine Trap-Vector Base-Address&#xff09;mepc&#xff08;Machine Exception Program Counter)mcause&#xff08;Machine Cause&#xf…