Node.js 核心知识点 - Koa 框架

一、Koa 基本概念

        官网:Koa - next generation web framework for node.js

1、Koa 是什么?

        Koa 是一个基于 Node.js 的轻量级 web 框架,由 Express 团队创造。Koa 的设计理念是使用现代的 JavaScript 特性(如 async/await)来增强开发体验,并提供更优雅、灵活的方式来构建 Web 应用。

2、Koa 核心概念

中间件机制

1、中间件的核心概念

Koa 使用中间件来处理 HTTP 请求。每个中间件是一个异步函数,可以执行一些操作,然后将控制权传递给下一个中间件。这种机制使得开发者可以很方便地编写和组合功能。

2、中间件的类型
(1) 应用级中间件

这些中间件绑定到 Koa 应用程序对象上,并在每个请求处理周期中执行。应用级中间件通常用于执行跨路由的共享任务,比如日志记录、错误处理、身份验证等。

// 应用级中间件
app.use(async (ctx, next) => {console.log('应用级中间件 - 这里可以处理每个请求前的共享任务');await next();
});
(2) 路由级中间件

这些中间件与特定路由相关联,只在特定路由匹配时执行。路由级中间件用于在特定路由上执行特定任务,比如请求验证、权限控制等。

// 路由级中间件
router.get('/', async (ctx, next) => {console.log('路由级中间件 - 只在根路由匹配时执行');await next();ctx.body = 'Hello, World!';
});
 (3) 错误处理中间件

错误处理中间件用于捕获应用程序中发生的错误,并作出相应的处理。在 Koa 中,错误处理中间件通常是最后一个中间件,用来处理未捕获的错误并发送适当的响应给客户端。

// 错误处理中间件
app.use(async (ctx, next) => {try {await next();} catch (err) {console.error('发生错误:', err.message);ctx.status = err.status || 500;ctx.body = {error: err.message};}
});
 (4) 内置中间件

Koa 提供了一些内置中间件,比如 koa-bodyparser 用于解析请求体,koa-static 用于提供静态文件服务等。这些内置中间件提供了常用功能的便捷实现。

// 错误处理中间件
app.use(async (ctx, next) => {try {await next();} catch (err) {console.error('发生错误:', err.message);ctx.status = err.status || 500;ctx.body = {error: err.message};}
});
3、中间件的 ctx、next
ctx - 核心功能: 获取请求信息、发送响应内容

next - 核心功能: 将控制权传递给下一个中间件函数。
app.use(async (ctx, next) => {// 这是一个中间件函数console.log('这是第一个中间件');// 调用下一个中间件await next();console.log('第一个中间件执行完成');
});app.use(async (ctx, next) => {// 这是第二个中间件console.log('这是第二个中间件');// 结束当前中间件,不调用 next(),则后续中间件将不会执行
});app.use(async (ctx, next) => {// 这是第三个中间件console.log('这是第三个中间件');// 调用下一个中间件await next();
});/*** 打印内容为:*  这是第一个中间件*  这是第二个中间件*  第一个中间件执行完成*  */

注意 有些中间件在其内部会默认调用 next(),这样可以确保中间件链中的下一个中间件会被执行。例如 koa-router 中间件、koa-bodyparser 中间件、koa-static 中间件等等

const Router = require('koa-router');
const router = new Router();router.get('/route', async (ctx, next) => {// 处理路由逻辑
});app.use(router.routes());

二、Koa 怎么用

1、基本使用

(1)下载必要中间件 koa(框架)、koa-bodyparser(路由)

npm install koa koa-router koa-bodyparser

(2)创建一个 Koa 应用

// 导入中间件
const Koa = require('koa');
const Router = require('koa-router');
const bodyParser = require('koa-bodyparser');const app = new Koa();
const router = new Router();// 使用 bodyparser 中间件(内部中间件、解析请求体)
app.use(bodyParser());// 定义路由
router.get('/', async (ctx) => {ctx.body = '欢迎访问后台接口';
});// 定义其他接口
router.get('/api/data', async (ctx) => {// 返回示例数据ctx.body = { message: '这是一个示例接口' };
});// 注册路由
app.use(router.routes());// 启动服务器
app.listen(3000, () => {console.log('服务器运行在 http://localhost:3000');
});

(3)启动 Koa 应用、并测试

2、项目中实际使用

(1)搭建基本目录结构

(2)搭建基本服务器

app.js - 入口文件 不是内部中间件都需要安装

// 导入中间件
const Koa = require('koa');
const Router = require('koa-router');
const bodyParser = require('koa-bodyparser'); // 内部中间件
const cors = require('@koa/cors')
const static = require('koa-static');const app = new Koa();
const router = new Router();// 使用 bodyparser 中间件(解析请求体)
app.use(bodyParser());
// // 使用 cors (处理跨域)
app.use(cors());// 定义路由
router.get('/', async (ctx) => {ctx.body = '欢迎访问后台接口';
});
// 访问静态资源路由
app.use(static('public'));// 注册路由
app.use(router.routes());// 错误处理中间件
app.use(async (ctx, next) => {try {await next();} catch (err) {console.error('发生错误:', err.message);ctx.status = err.status || 500;ctx.body = {error: err.message};}
});// 启动服务器
app.listen(3000, () => {console.log('服务器运行在 http://localhost:3000');
});

(3)创建数据库连接对象并导出

下载 mysql
npm i mysql
db文件夹下创建 db.js 文件、内容如下
//导入 mysql 模块
const mysql = require('mysql')// 创建数据库连接对象
const db = mysql.createPool({host: '127.0.0.1',user: 'root',password: '123456',database: 'wallpaper'
})// 向外共享数据库连接对象
module.exports = db

(4)操作数据库、并优化项目结构。

1、定义路由处理函数并导出

// 导入数据库连接对象
const db = require('../db/db.js')// 路由处理函数
exports.apiTest = async (ctx) => {// 查询的 sql 语句const sql = `SELECT * FROM classify`const result = await new Promise((resolve, reject) => {// 执行查询的 sql 语句db.query(sql, (err, result) => {// 执行错误if(err) {resolve(err)}resolve(result)})})// 返回响应信息ctx.body = result;
}
 2、定义路由对象挂载路由,并导出路由对象

// 导入路由
const Router = require('koa-router');
// 导入路由处理函数
const { apiTest } = require('../router_handle/router_hander.js')// 创建路由对象
const router = new Router();router.get('/apiTest', apiTest);module.exports = router
  3、修改入口文件 app.js
// 导入中间件
const Koa = require('koa');
const bodyParser = require('koa-bodyparser'); // 内部中间件
const cors = require('@koa/cors')
const static = require('koa-static');const app = new Koa();// 导入路由对象
const router = require('./router/router.js')// 使用 bodyparser 中间件(解析请求体)
app.use(bodyParser());
// // 使用 cors (处理跨域)
app.use(cors());// 访问静态资源路由
app.use(static('public'));// 注册路由
app.use(router.routes());// 错误处理中间件
app.use(async (ctx, next) => {try {await next();} catch (err) {console.error('发生错误:', err.message);ctx.status = err.status || 500;ctx.body = {error: err.message};}
});// 启动服务器
app.listen(3000, () => {console.log('服务器运行在 http://localhost:3000');
});
4、测试 apiTest 接口

这里用的 Apifox:Apifox

(5)文件处理接口的构建

1>  安装 @koa/multer - 处理 multipart/form-data 类型的表单数据,特别是文件上传。

npm install @koa/multer

2> 设置文件存储选项和存储方式、并挂载上传接口路由上
// 导入 @koa/multer
const multer = require('@koa/multer')// 设置存储选项
const storage = multer.diskStorage({destination: function (req, file, cb) {cb(null, 'public/file/'); // 文件存储路径},filename: function (req, file, cb) {const fileExtension = file.originalname.split('.').pop(); // 获取文件扩展名cb(null, file.originalname.split('.')[0] + '-' + Date.now() + '.' + fileExtension); // 文件名设置为原文件名+时间戳}
});// 设置存储方式为内存存储
const upload = multer({ storage: storage });router.post('/upload', upload.single('file'), async (ctx) => {ctx.body = {status: 200,message: '文件上传成功',data: {fileUrl: `${url}:${port}` + '/public/file' + ctx.file.filename, // 返回存储的文件路径(${url}:${port}替换成你启动的服务器地址)fileName: ctx.file.originalname, // 原始文件名称saveFileName: ctx.file.filename // 存储的文件名称}};
});

更多接口持续更新中...

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

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

相关文章

【Spring cloud】 认识微服务

文章目录 🍃前言🌴单体架构🎋集群和分布式架构🌲微服务架构🎍微服务带来的挑战⭕总结 🍃前言 本篇文章将从架构的演变过程来简单介绍一下微服务,大致分为一下几个部分 单体架构集群和分布式架…

九芯电子手把手教你选购电动车防盗语音报警器芯片

电动车,也叫电瓶车,加装的防盗器声音非常大,能使电动车防盗报警器变得更智能化,功能多样化。本文将介绍在选购电动车防盗语音报警芯片,应该考虑哪些因素,以确保所选产品既满足安全需求,又具备物…

深度学习-数学基础(四)

深度学习数学基础 数学基础线性代数-标量和向量线性代数-向量运算向量加和向量内积向量夹角余弦值 线性代数-矩阵矩阵加法矩阵乘法矩阵点乘矩阵计算的其他内容 人工智能-矩阵的操作矩阵转置(transpose)矩阵与向量的转化 线性代数-张量(tensor…

CFS三层内网渗透——第二层内网打点并拿下第三层内网(三)

目录 八哥cms的后台历史漏洞 配置socks代理 ​以我的kali为例,手动添加 socks配置好了,直接sqlmap跑 ​登录进后台 蚁剑配置socks代理 ​ 测试连接 ​编辑 成功上线 上传正向后门 生成正向后门 上传后门 ​内网信息收集 ​进入目标二内网机器&#xf…

phpcms 升级php8.3.8

windows 2008 server 不支持php8.3.8,需升级为windows 2012 1.下载php8.3.8 PHP8.3.9 For Windows: Binaries and sources Releases 2.配置php.ini (1.)在php目录下找到php.ini-development文件,把它复制一份,改名为php.ini (2.)修改php安装目录 根…

昇思MindSpore学习笔记4-02生成式--DCGAN生成漫画头像

摘要: 记录了昇思MindSpore AI框架使用70171张动漫头像图片训练一个DCGAN神经网络生成式对抗网络,并用来生成漫画头像的过程、步骤。包括环境准备、下载数据集、加载数据和预处理、构造网络、模型训练等。 一、概念 深度卷积对抗生成网络DCGAN Deep C…

Runway Gen-3 实测,这就是 AI 视频生成的 No.1!视频高清化EvTexture 安装配置使用!

Runway Gen-3 实测,这就是 AI 视频生成的 No.1!视频高清化EvTexture 安装配置使用! 由于 Runway 作为一个具体的工具或平台,其详细信息在搜索结果中没有提供,我将基于假设 Runway 是一个支持人工智能和机器学习模型的创意工具,提供一个关于使用技巧和类似开源项目的文稿总…

视频字幕提取在线工具有哪些?总结5个字幕提取工具

平时在沉浸式追剧的时候,我们常常都会被影视剧中的各种金句爆梗而逗得开怀大笑~而真正要用到时候却总是一片头脑空白。其实要记住它们最好的办法便是将其提取留档下来,每次有需要的时候打开就能一下子回顾到~ 今天就来带大家盘一盘视频字幕提取的软件好…

动态规划入门,从简单递归到记忆化搜索到动态规划

动态规划入门&#xff0c;从简单递归到记忆化搜索到动态规划 打家劫舍 class Solution {private int nums[];public int rob(int[] nums) {this.nums nums;return dfs(nums.length - 1);}public int dfs(int i){if (i < 0){return 0;}int res Math.max(dfs(i - 1), dfs(i…

【分布式数据仓库Hive】Hive的安装配置及测试

目录 一、数据库MySQL安装 1. 检查操作系统是否有MySQL安装残留 2. 删除残留的MySQL安装&#xff08;使用yum&#xff09; 3. 安装MySQL依赖包、客户端和服务器 4. MySQL登录账户root设置密码 5. 启动MySQL服务 6. 登录MySQL&#xff0c;进入数据库操作提示符 7. 授权H…

SpringBoot 启动流程六

SpringBoot启动流程六 这句话是创建一个上下文对象 就是最终返回的那个上下文 我们这个creatApplicationContext方法 是调用的这个方法 传入一个类型 我们通过打断点的方式 就可以看到context里面的东西 加载容器对象 当我们把依赖改成starter-web时 这个容器对象会进行…

深度解析Java世界中的对象镜像:浅拷贝与深拷贝的奥秘与应用

在Java编程的浩瀚宇宙中&#xff0c;对象拷贝是一项既基础又至关重要的技术。它直接关系到程序的性能、资源管理及数据安全性。然而&#xff0c;提及对象拷贝&#xff0c;不得不深入探讨其两大核心类型&#xff1a;浅拷贝&#xff08;Shallow Copy&#xff09;与深拷贝&#xf…

等保2.0标准相比之前的有哪些重大变化?

在数字化的浪潮中&#xff0c;网络安全如同一艘坚固的航船&#xff0c;承载着国家与民族的希望&#xff0c;驶向信息化的彼岸。等级保护制度&#xff08;等保&#xff09;作为中国网络安全的守护神&#xff0c;经过岁月的洗礼与智慧的积淀&#xff0c;迎来了等保2.0的时代&…

Android仿天眼查人物关系图

效果图预览 绘制思路 这里使用了中学解析几何知识 XPoint OPointX OPointXcosθ&#xff1b; YPoint OPointY OPointYsinθ&#xff1b; canvas.drawText(lists.get(i).getName(), XPoint (float) Math.cos(pere * i 5) * radius[i % radius.length] - 30, YPoint (fl…

C语言 | Leetcode C语言题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; int robRange(int* nums, int start, int end) {int first nums[start], second fmax(nums[start], nums[start 1]);for (int i start 2; i < end; i) {int temp second;second fmax(first nums[i], second);first temp;}retur…

昇思25天学习打卡营第9天|保存与加载

保存与加载 在训练网络模型的过程中&#xff0c;保存中间和最后结果可以用来微调和后续的模型推理与部署。 # 首先定义一个模型 def network():model nn.SequentialCell(nn.Flatten(),nn.Dense(28*28, 512),nn.ReLU(),nn.Dense(512, 512),nn.ReLU(),nn.Dense(512, 10))retur…

Hive-存储-文件格式

一、前言 数据存储是Hive的基础&#xff0c;选择合适的底层数据存储格式&#xff0c;可以在不改变Hql的前提下得到大的性能提升。类似mysql选择适合场景的存储引擎。 Hive支持的存储格式有 文本格式&#xff08;TextFile&#xff09; 二进制序列化文件 &#xff08;SequenceF…

(vue)el-tabs选中最后一项后更新数据后无法展开

(vue)el-tabs选中最后一项后更新数据后无法展开 效果&#xff1a; 原因&#xff1a;选中时绑定的值在数据更新后找不到 思路&#xff1a;更新数据时把选中的v-model的属性赋为初始值 写法&#xff1a; <el-form-item label"字段选择"><el-tabsv-model&qu…

相关款式1111

一、花梨木迎客松 1. 风速打单 发现只有在兄弟店铺有售卖 六月份成交订单数有62笔 2. 生意参谋 兄弟店铺商品访客数&#xff1a;3548&#xff0c;支付件数&#xff1a;95件 二. 竹节茶刷&#xff08;引流&#xff09; 1. 风速打单 六月订单数有165笔 兄弟&#xff1a;…

喜报 | 怿星携高性价比国产方案亮相IAEIS峰会并荣获“优秀创新产品奖”

近日&#xff0c;由深圳市汽车电子行业协会主办的主题为&#xff1a;“布局全球产业链&#xff0c;促进智能网联汽车产业高质量发展”IAEIS 2024第十三届国际汽车电子产业峰会”暨“2023年度汽车电子科学技术奖”颁奖典礼在深圳隆重举行。 怿星科技携高性价比的「车载网络通信 …