Koa2-创建、中间件、连接数据库、处理请求、日志

news2025/5/26 9:55:31

文章目录

  • 安装配置koa2
    • 配置nodemon,热更新我们的项目
  • 中间件
    • 什么是中间件
    • 👻洋葱模型
    • 路由中间件
  • 连接数据库 - mysql
  • 后端允许跨域
    • 处理请求
      • get
      • post
      • put
      • delete
  • 后续会继续更新

在这里插入图片描述

安装配置koa2

👻安装 koa2

npm i koa2 -s

👻在package.json 配置,当然是在npm init的基础之上

"scripts": {
    "start": "node index.js"
    ...
  },

👻这样就可以 借用 npm run start 来启动

配置nodemon,热更新我们的项目

nodemon详解

npm i nodemon -s

👻在package.json中配置 scripts/start 改为

"scripts": {
    "start": "nodemon index.js"
    ...
  },

中间件

什么是中间件

中间件的本质为一个回调函数,参数包含请求对象、响应对象和执行下一个中间件的函数
koa中间件采用的是洋葱模型、每次执行下一个中间件传入两个参数
ctx: 封装了request和response 的变量
next: 进入下一个要执行的中间件函数

👻洋葱模型

在这里插入图片描述
👻下面的示例代码可以说明这种情况

app.use(async (ctx,next) => {
    console.log(1)
    await next()
    console.log(1)
})
app.use(async (ctx,next) => {
    console.log(2)
    await next()
    console.log(2)
})
app.use(async (ctx,next) => {
    console.log(3)
    await next()
    console.log(3)
})

👻结果如下
在这里插入图片描述

路由中间件

npm i koa-router	-s

👻我们直接给koa-router -s 做迁移(单独的文件夹存放),并对该模块进行切片
新建 Router/index.js

const Router = require('koa-router')
const router =  new Router()
const user = require('./user')
router.use('/user',user.routes(),user.allowedMethods())
// 重定向
router.redirect('/','/user')
module.exports = router

👻新建 Router/user.js

const Router = require("koa-router")
const user = new Router()
user.get('/add',(ctx)=>{
    ctx.body = "添加用户"
})

module.exports = user

👻原本的入口文件 index.js

const koa = require('koa2')
const router = require('./Router')
const { port } = require('./setting')
// 声明一个实例
const app = new koa()

/**
 * router.routers()作用是启动路由
 * router.allowedMethods()允许所有请求方法111
 */
app.use(router.routes(),router.allowedMethods())
app.listen(port, () => {
    console.log("localhost:"+`${port}`)
})

👻以上就完成了路由模块的基本内容

连接数据库 - mysql

👻首先准备好数据库
👻新建连接数据库的代码

const mysql = require('mysql')

const connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : 'xxx',
    database : 'property'
});

connection.connect()

connection.query('select * from user',function(err,results,fileds){
    if(err)throw err
    console.log(results)
})
connection.end()

👻在这里mysql的版本过新的话会出现
Client does not support authentication protocol requested by server; consider upgrading MySQL cli
这是由于mysql版本过高,8版本的用户密码加密规则与以往的不同,可以参考下面的进行更改,加密规则
解决办法

👻我们可以选择连接池进行连接,并进行封装

const mysql = require('mysql')
// 连接池
const pool = mysql.createPool({
    connectionLimit: 10,
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'property'
});

/**
 * 查询操作数据库函数
 * @param sql sql语句
 * @param callback 回调函数
 */
function query(sql, callback) {
    pool.getConnection((err, connection) => {
        if (err) throw err
        connection.query(sql, (err, rows) => {
            callback(err, rows)
            connection.release()
        })
    })
}

module.exports = query

const db = require('../utils/db')
db('select * from user',(err,rows)=>{
    if(err)throw err
    console.log(rows)
})

👻详细内容
mysql包官方文档

后端允许跨域

npm i koa2-cors

👻这个中间件一定要写在路由之前

app.use(cors());
app.use(router.routers(),router.allowMethods());

处理请求

我们暂时都是靠postman模拟发送请求

get

post

处理post请求,需要借助koa-body中间件,koa-body支持解析json,也支持文件解析
在这里安装一下

npm  i  koa-body

index.js 入口文件

const {koaBody} = require('koa-body')
app.use(koaBody());

put

delete

后续会继续更新

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

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

相关文章

如何在QEMU社区提Bug

当在编译及使用QEMU的过程中发现问题又不能自行解决时,可以去QEMU官网提Bug。本文以笔者实际遇到的问题为例,讲解提交QEMU Bug的完整过程。 1. 访问QEMU主页 QEMU官网主页地址为:https://www.qemu.org/ 页面如下: 2. 跳转至CON…

RK3566 多Mipi屏的兼容

需求:项目需求需要同一个固件兼容两款不同IC的mipi屏。以便有一个IC停产之后使用不受影响。由于是同一个模组厂商,所以设计初就要求硬件接口一样或者兼容。 方法:一开始的想法很简单和网上以及同行提供的方法一样在uboot阶段去读屏的ID,然后再把对应屏ID放到cmdline里面去传…

Parasoft全面发布最广泛的MISRA规则覆盖

Parasoft通过其经过市场验证的自动化软件测试工具集成套件,帮助企业持续交付高质量的软件。Parasoft的技术支持嵌入式、企业和物联网市场,通过将静态代码分析和单元测试、Web UI和API测试等所有内容集成到交付管道中,再加上服务虚拟化和完整的…

Python 数据库开发实战 - Python与Redis交互篇- 综合案例 - 新闻管理系统 - 缓存新闻数据至redis

接下来这个章节将继续来完成 《新闻管理系统》 这个项目,上一章节我们完成了 “发表新闻” 这个功能,在发表新闻后,什么时候才会缓存该条新闻记录呢?并不是说在发表新闻成功之后就立刻被缓存,而是该新闻被管理员审批通…

基于Verilog HDL的状态机描述方法

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。 🔥文章和代码已归档至【Github仓库&#xf…

配置类的几种写法

需求 通过java配置类实现一个数据库连接池。 以前xml中是这样写的&#xff1a; <!--配置德鲁伊数据库连接池--><bean id"ds" class"com.alibaba.druid.pool.DruidDataSource"><property name"driverClassName" value"${jdbc…

Selenium常用API详解(从入门到进阶)

目录 1、打开页面 2、查找页面元素 3、输入文本 4、点击操作 5、提交操作 6、清除文本 7、获取文本、属性 8、获取页面的标题和URL 9、窗口 9.1、设置窗口大小 9.2、窗口切换 9.2.1、为什么需要窗口切换&#xff1f; 9.2.2、获取句柄的方式 9.2.3、切换句柄 10、…

PHP环境配置和验证

很多文章都把php和apache环境混合在一起讲&#xff0c;美其名曰PHP环境配置并提供验证是编写phpinfo命令。概念都搞不清后继的学习也好频频失误。 1、获取PHP。这个有说法网上有讲的总结的很到位。 windos服务器&#xff1a; 1、如果你是PHPIIS&#xff1b;请选择&#xff1…

VBA提高篇_ 20 括号的使用 _值/引用传递

文章目录1. 决定函数调用是否使用括号的三种情境:2. VBA对象的默认属性3.过程/函数的传递方式 :1. 决定函数调用是否使用括号的三种情境: 没有参数: 不写有参数: 调用语句处于一行代码中间: 写有参数: 调用语句独占一行代码: 不写 括号的特殊含义: Evaluation(求职运算) 2. VB…

开发必看!三分钟读懂Salesforce SOQL查询和限制

SOQL是支持我们与Salesforce数据库交互的查询语言。开发人员在编写Apex时通常会使用到SOQL&#xff0c;此外&#xff0c;它还允许管理员和开发人员从组织内部检索数据并在导出结果时生成强大的数据报告。 SOQL 查询对于编写代码的开发人员&#xff0c;以及通过使用子句扩展查询…

CK-GW208-EC与汇川PLC配置走EtherCAT通讯指南

CK-GW208-EC这款产品是晨控智能一款工业级 IO-LINK 主站网关&#xff0c;支持 EtherCat 工业协议。可通过以太网接口&#xff0c;对 IO-LINK 从站设备进行控制。CK-GW208-EC 是一款支持标准工业 Ethercat协议的 IO-LINK主站网关&#xff0c;方便用户快速便捷的集成到 PLC 等控制…

GLP-1类药物研发进展-销售数据-上市药品前景分析

据一项2021 年的报告发现&#xff0c;当 GLP-1 类似物用于治疗 2 型糖尿病时&#xff0c;全因死亡率降低了 12%&#xff0c;它们不仅降糖效果显著&#xff0c;同时还兼具减重、降压、改善血脂谱等作用。近几年&#xff0c;随着GLP-1R激动剂类药物市场规模不断增长&#xff0c;美…

Disruptor实战和笔记之二:Disruptor类分析

1 本篇概览通过前文的实战&#xff0c;咱们对Disruptor有了初步认识&#xff0c;借助com.lmax.disruptor.dsl.Disruptor类可以轻松完成以下操作&#xff1a;环形队列初始化指定事件消费者启动消费者线程接下来要面对两个问题&#xff1a;深入了解Disruptor类是如何完成上述操作…

第十四期 | ETC车主收到的诈骗短信原来是黑灰产在搞鬼?

目录 互联网时代&#xff0c;车企的安全挑战 黑灰产的两种攻击方式&#xff1a;撞库攻击&密码爆破攻击 1、撞库攻击&#xff1a; 2、密码爆破攻击 黑灰产变现方式 1、贩卖数据 2、直接变现 3、电信诈骗 防控建议 1、终端加固/H5混淆 2、通信传输安全保障 3、行…

Java知识点细节简易汇总——(7)面向对象编程(高级部分)

一、类变量、静态变量static static访问方式&#xff1a; public class VisitStatic {public static void main(String[] args) {//方法一://类名.类变量名//说明&#xff1a;类变量是随着类的加载而创建&#xff0c;所以即使没有创建对象实例也可以访问System.out.println(A.…

代码随想录NO38 |动态规划——leetcode 343. 整数拆分 96.不同的二叉搜索树

动态规划—leetcode 343. 整数拆分 96.不同的二叉搜索树今天是动态规划第三天的题&#xff0c;动态规划这块儿题目比较多&#xff01; 343. 整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的…

拼经济促发展,雨花区脚踏实地将“民生愿景”变为“幸福实景”

2022年&#xff0c;面对国内外复杂的经济形势&#xff0c;我国经济发展依旧保持稳中向好态势。经济增长总体平稳且后续动力强劲&#xff0c;物价涨幅持续可控&#xff0c;结构调整积极推进。经济增长由政策刺激向自主增长有序转变&#xff0c;继续朝着宏观调控的预期方向发展&a…

Linux环境下Redis单机、集群升级部署

目录 前言 一、Redis安装环境准备 二、安装升级Redis 1.Redis升级前准备&#xff08;首次安装忽略&#xff09; 2.Redis安装 总结 前言 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可…

回顾 | .NET MAUI 跨平台应用开发 - 用 .NET MAUI 开发一个无人机应用(下)

点击蓝字关注我们编辑&#xff1a;Alan Wang排版&#xff1a;Rani Sun微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0c;将…

七、Linux文件 - main函数参数讲解、代码实现cp指令

目录 1、main函数参数 2.cp指令的使用 3、实现cp指令 3.1实现cp指令-入门版 3.2实现cp指令-进阶版 1、main函数参数 int main(int argc,char *argv[]) {return 0; } C语言规定了main函数的参数只能由2个&#xff0c;一个是argc,一个是argv,并且argc只能是整数&#xff0c…