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

路由

安装

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',
    timezone: '+08:00' // 指定时区为东八区
  }
);

// 测试数据库的连接
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',
  timezone: '+08:00' // 指定时区为东八区
});

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

// 导出

module.exports = sequelize;

在这里插入图片描述

注意

  • 你要在项目根目录下运行,不要跑到具体的文件夹里运行,否则.env文件里的变量无法加载
  • .env 文件中 # 是注释符号,如果你定义的变量值(字符串)里有这个符合,那么必须要加上引号
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
是的,你可以使用koa2框架与mysql2库连接和操作数据库。下面是一个简单的示例: 首先,你需要安装所需的依赖: ``` npm install koa koa-router koa-bodyparser mysql2 ``` 然后,在你的项目中创建一个数据库连接配置文件(比如config.js),并填写数据库的相关信息: ```javascript // config.js module.exports = { database: 'your_database_name', username: 'your_username', password: 'your_password', host: 'your_host', port: 'your_port' }; ``` 接下来,创建一个数据库连接池并导出供其他模块使用: ```javascript // db.js const mysql = require('mysql2/promise'); const config = require('./config.js'); const pool = mysql.createPool({ host: config.host, port: config.port, user: config.username, password: config.password, database: config.database, connectionLimit: 10 // 可以根据需要进行调整 }); module.exports = pool; ``` 最后,在你的路由文件中使用数据库连接池来执行查询和操作: ```javascript // routes.js const Router = require('koa-router'); const pool = require('./db.js'); const router = new Router(); router.get('/users', async (ctx) => { try { const [rows] = await pool.query('SELECT * FROM users'); ctx.body = rows; } catch (err) { console.error(err); ctx.status = 500; ctx.body = 'Error occurred while fetching users'; } }); // 其他路由和操作 module.exports = router; ``` 这只是一个简单的示例,你可以根据自己的需求进行更复杂的数据库操作。记得在需要使用数据库连接的地方引入连接池,并根据需要执行查询、插入、更新等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无知的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值