Koa学习

Koa 安装与配置

1. 初始化项目

在终端中执行以下命令:

# 创建项目文件夹
mkdir koa
cd koa# 初始化并安装依赖
npm init -y
npm install koa
npm install nodemon --save-dev

2. 修改 package.json

package.json 文件中进行如下修改:

{"type": "module","scripts": {"dev": "nodemon index.js","test": "echo \"Error: no test specified\" && exit 1"}
}

3. 编写初始化代码

在终端中新建 index.js 文件:

# 测试代码文件
code index.js

index.js 中添加以下代码:

import Koa from 'koa';const hostname = "127.0.0.1"; // 服务器监听的 IP 地址
const port = 8008; // 服务器监听的端口号// 实例化一个 Koa 对象
const app = new Koa();// 注册中间件
app.use(async ctx => {ctx.body = "Helloworld"; // 设置响应体的内容
});// 启动 HTTP 服务器
app.listen(port, hostname, () => {console.log(`服务器已启动: http://${hostname}:${port}`);
});

4. 启动服务器

在终端中运行以下命令以启动服务器:

npm run dev

2. 中间件

import Koa from 'koa';const hostname = "127.0.0.1"; // 服务器监听的 IP 地址
const port = 8008; // 服务器监听的端口号// 实例化一个 Koa 对象
const app = new Koa();// 演示中间件
app.use(async (ctx, next) => {console.log(111);await next();console.log(222);
});// 注册中间件
app.use(async ctx => {ctx.body = "Helloworld"; // 设置响应体的内容console.log(333);
});// 启动 HTTP 服务器
app.listen(port, hostname, () => {console.log(`服务器已启动: http://${hostname}:${port}`);
});

打印两遍是因为请求了图标,block即可

在这里插入图片描述


3. 安装和配置路由 - GET 请求

安装路由:

npm i @koa/router

测试代码:

import Koa from 'koa';
import Router from '@koa/router';const hostname = "127.0.0.1"; // 服务器监听的 IP 地址
const port = 8008; // 服务器监听的端口号// 实例化一个 Koa 对象
const app = new Koa();
const router = new Router(); // 实例化一个 Router 对象router.get('/', async ctx => { // GET 请求ctx.body = "Helloworld";
});router.get('/test', async ctx => { // GET 请求let id = ctx.query.id;let web = ctx.query.web;ctx.body = id + " : " + web;
});router.get('/test2/id/:id/web/:web', async ctx => {let id = ctx.params.id;let web = ctx.params.web;ctx.body = id + " : " + web;
});router.redirect('/test3', 'https://www.baidu.com');app.use(router.routes());// ************************
const userRouter = new Router({ prefix: '/user' });
userRouter.get('/add', async ctx => {ctx.body = "添加用户";
});
userRouter.get('/del', async ctx => {ctx.body = "删除用户";
});
app.use(userRouter.routes());// 在所有路由之后添加 404 处理函数
app.use(async ctx => {if (!ctx.body) { // 若没有设置 ctx.body, 则说明没有匹配任何路由ctx.status = 404;ctx.body = '404 Not Found';}
});// 启动 HTTP 服务器
app.listen(port, hostname, () => {console.log(`服务器已启动: http://${hostname}:${port}`);
});

4. POST 请求

安装 @koa/bodyparser

npm i @koa/bodyparser

测试代码:

import Koa from 'koa';
import Router from '@koa/router';
import BodyParser from '@koa/bodyparser';const hostname = "127.0.0.1"; // 服务器监听的 IP 地址
const port = 8008; // 服务器监听的端口号// 实例化一个 Koa 对象
const app = new Koa();
const router = new Router(); // 实例化一个 Router 对象app.use(BodyParser()); // 使用 @koa/bodyparser 中间件来解析 POST 请求// ------ POST 请求
// [application/x-www-form-urlencoded] http://127.0.0.1:8008/postUrl
router.post('/postUrl', async ctx => {let id = ctx.request.body.id;let web = ctx.request.body.web;ctx.body = id + " : " + web;
});// [application/json] http://127.0.0.1:8008/postJson
router.post('/postJson', async ctx => {let id = ctx.request.body.id;let web = ctx.request.body.web;ctx.body = id + " : " + web;
});app.use(router.routes()); // 将定义在 router 对象中的路由规则添加到 app 实例中// 启动 HTTP 服务器
app.listen(port, hostname, () => {console.log(`服务器已启动: http://${hostname}:${port}`);
});

5. 错误处理

测试代码:

import Koa from 'koa';
import Router from '@koa/router';const hostname = "127.0.0.1";
const port = 8008;const app = new Koa();
const router = new Router();router.get('/', async ctx => {throw new Error("测试");
});/*将 '错误处理中间件' 放在 '路由处理中间件' 之前, 当一个请求到达时,会先经过 '错误处理中间件', 然后才会进入 '路由处理中间件',是为了确保可以捕获错误
*/
app.use(async (ctx, next) => { // 错误处理中间件try {await next();} catch (err) {console.log('err:', err);ctx.status = 500;ctx.body = 'err: ' + err.message;}
});app.use(router.routes()); // 路由处理中间件app.listen(port, hostname, () => {console.log(`服务器已启动: http://${hostname}:${port}`);
});

6. 跨域

测试代码:

import Koa from 'koa';
import Router from '@koa/router';
import Cors from '@koa/cors';const hostname = "127.0.0.1";
const port = 8008;const app = new Koa();
const router = new Router(); // 实例化一个 Router 对象app.use(Cors()); // 允许跨域请求router.get('/', async ctx => { // GET 请求ctx.body = "Helloworld";
});app.use(router.routes()); // 将定义在 router 对象中的路由规则添加到 app 实例中app.listen(port, hostname, () => {console.log(`服务器已启动: http://${hostname}:${port}`);
});

7. Koa 图片上传功能实现指南

1. 安装依赖

在终端中执行以下命令以安装 @koa/multer

npm install @koa/multer

注意事项

安装过程中可能会出现如下警告:

npm warn deprecated @babel/plugin-proposal-export-namespace-from@7.18.9:
This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained.
Please use @babel/plugin-transform-export-namespace-from instead.

2. 编写代码

index.js 中添加以下代码:

import Koa from 'koa';
import Router from '@koa/router';
import BodyParser from '@koa/bodyparser';
import Cors from '@koa/cors';
import Multer from '@koa/multer';
import path from 'path';const hostname = "127.0.0.1";
const port = 8008;const app = new Koa();
const router = new Router(); // 实例化一个 Router 对象app.use(BodyParser()); // 使用 @koa/bodyparser 中间件解析 POST 请求
app.use(Cors()); // 允许跨域请求// 配置磁盘存储引擎
const storage = Multer.diskStorage({destination: (request, file, callbackFunc) => { // 指定文件保存路径callbackFunc(null, './upload');},filename: (request, file, callbackFunc) => { // 设置文件名callbackFunc(null, Date.now() + path.extname(file.originalname));},
});const multer = Multer({ // 实例化一个 Multer 对象storage, // 磁盘存储引擎limits: { // 限制条件fileSize: 2 * 1024 * 1024, // 限制文件大小为 2MB},fileFilter: (request, file, callbackFunc) => { // 文件过滤器const allowedTypes = ['image/jpeg', 'image/jpg', 'image/png'];if (allowedTypes.includes(file.mimetype)) {callbackFunc(null, true);} else {callbackFunc(new Error('不支持的文件类型'), false);}}
});// 上传接口
router.post('/upload', multer.single('file'), async ctx => {const file = ctx.request.file; // 获取上传的文件信息if (file) {console.log(file);ctx.body = "文件上传成功";}
});// 错误处理中间件
app.use(async (ctx, next) => {try {await next();} catch (err) {ctx.status = 500;ctx.body = 'err: ' + err.message;}
});app.use(router.routes()); // 路由处理中间件// 启动服务器
app.listen(port, hostname, () => {console.log(`服务器已启动: http://${hostname}:${port}`);
});

3. 启动服务器

在终端中运行以下命令以启动服务器:

npm run dev

4. 上传文件

使用 POST 请求上传文件到 http://127.0.0.1:8008/upload,确保请求中包含名为 file 的文件字段。

在这里插入图片描述


8. Cookie

测试代码:

import Koa from 'koa';
import Router from '@koa/router';const hostname = "127.0.0.1";
const port = 8008;const app = new Koa();
const router = new Router(); // 实例化一个 Router 对象// Cookie 可用于在浏览器中存储数据
router.get('/', async ctx => {// 赋值ctx.cookies.set("name", encodeURIComponent("hello")); // encodeURIComponent: URL 编码ctx.cookies.set("web", "baidu.com", {maxAge: 5 * 1000, // 30 秒 [maxAge: 有效期 单位: 毫秒]httpOnly: false // 允许浏览器通过 JS 访问和修改该 cookie});// 取值 - 在同一个请求内, 无法立即获取到刚刚设置的 cookie 的值let name = ctx.cookies.get("name");console.log("name:", decodeURIComponent(name)); // decodeURIComponent: URL 解码// 删除// ctx.cookies.set("name", "", { maxAge: 0 });ctx.body = "Helloworld";
});app.use(router.routes()); // 将定义在 router 对象中的路由规则添加到 app 实例中app.listen(port, hostname, () => {console.log(`服务器已启动: http://${hostname}:${port}`);
});

9. Session(存在客户端的 Cookie 中,一般别用)

安装 koa-session

npm i koa-session

测试代码:

import Koa from 'koa';
import Router from '@koa/router';
import Session from 'koa-session';const hostname = "127.0.0.1";
const port = 8008;const app = new Koa();
const router = new Router(); // 实例化一个 Router 对象// koa-session 默认将 session 数据存储在客户端的 cookie 中
app.keys = ['session.dengruicode.com']; // 设置会话签名的密钥
const CONFIG = {key: 'DR', // 存储在 cookie 中的键名maxAge: 24 * 60 * 60 * 1000, // 24 小时 有效期 (单位: 毫秒)signed: true, // 是否启用会话签名, 用于防止 CSRF 攻击secure: false, // 是否仅通过 https 协议发送 cookie
};
app.use(Session(CONFIG, app));router.get('/', async ctx => {// 赋值ctx.session.name = "邓瑞";ctx.session.url = "dengruicode.com";if (!ctx.session.user) {ctx.session.user = 100;} else {ctx.session.user++;}// 取值let name = ctx.session.name;console.log("name:", name);// 删除// ctx.session = null; // 清空// delete ctx.session.name; // 删除 session 中的 name 属性ctx.body = "用户:" + ctx.session.user;
});app.use(router.routes()); // 将定义在 router 对象中的路由规则添加到 app 实例中app.listen(port, hostname, () => {console.log(`服务器已启动: http://${hostname}:${port}`);
});

10. JWT

安装 jsonwebtoken

npm i jsonwebtoken

JWT 结构

JWT(JSON Web Token)是一种基于令牌的认证和授权机制,由三部分组成:Header(头部)、Payload(负载)、Signature(签名)。

Header(头部)

{"alg": "HS256", // algorithm 算法"typ": "JWT" // type 类型
}

Payload(负载)

{"sub": 1, // Subject 主题 (用户唯一 ID)"iss": "dengruicode.com", // Issuer 发行者"iat": 1719930255, // Issued At 发行时间"nbf": 1719930255, // Not Before 生效时间"exp": 1720016655, // Expiration Time 过期时间"aud": [ // Audience 观众字段为空, 表示没有观众限制, 可以被任何接收方处理""],"data": { // 自定义数据"name": "邓瑞","gender": "男"}
}

Signature(签名)

HMACSHA256(base64UrlEncode(Header) + "." +base64UrlEncode(Payload),密钥
)

测试代码:

import Koa from 'koa';
import Router from '@koa/router';
import JWT from 'jsonwebtoken';const hostname = "127.0.0.1";
const port = 8008;const app = new Koa();
const router = new Router(); // 实例化一个 Router 对象router.get('/', async ctx => {let key = 'koaTest'; // 密钥let token = generateToken(key); // 生成 tokenparseToken(token, key); // 解析 tokenctx.body = token;
});app.use(router.routes()); // 将定义在 router 对象中的路由规则添加到 app 实例中// 生成 token
let generateToken = key => {let id = 1; // 用户唯一 IDlet now = Math.floor(Date.now() / 1000); // 当前时间戳 单位: 秒let expire = 24 * 60 * 60;// 负载let payload = {sub: id, // Subject 主题 (用户唯一 ID)iss: 'dengruicode.com', // Issuer 发行者iat: now, // Issued At 发行时间nbf: now, // Not Before 生效时间exp: now + expire, // Expiration Time 过期时间aud: [''], // Audience 观众字段为空, 表示没有观众限制, 可以被任何接收方处理data: { // 自定义数据name: '邓瑞',gender: '男',}};// 使用负载(payload)、密钥(key)和指定的签名算法(HS256)生成 tokenlet token = JWT.sign(payload, key, { algorithm: 'HS256' });return token;
};// 解析 token
let parseToken = (token, key) => {let payload = JWT.verify(token, key, { algorithm: 'HS256' });console.log('解析后的 payload:', payload);
};app.listen(port, hostname, () => {console.log(`服务器已启动: http://${hostname}:${port}`);
});

以上是 Koa 的基本使用指南和功能实现,包括中间件、路由、错误处理、跨域、文件上传、Cookie、Session 和 JWT 等功能。确保在实际开发中根据需求进行适当的修改和扩展。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第472题连接词

题目&#xff1a; 题解&#xff1a; typedef struct Trie {struct Trie * children[26];bool isEnd; }Trie;#define TRIE_INITIAL(node) do { \for (int i 0; i < 26; i) { \(node)->children[i] NULL; \} \(node)->isEnd false; \ }while(0);static void freeTri…

互联网线上融合上门洗衣洗鞋小程序,让洗衣洗鞋像点外卖一样简单

随着服务创新的风潮&#xff0c;众多商家已巧妙融入预约上门洗鞋新风尚&#xff0c;并携手洗鞋小程序&#xff0c;开辟线上蓝海。那么&#xff0c;这不仅仅是一个小程序&#xff0c;它究竟蕴含着哪些诱人好处呢&#xff1f; 1. 无缝融合&#xff0c;双线共赢&#xff1a;小程序…

美团Java一面

美团Java一面 9.24一面&#xff0c;已经寄了 收到的第一个面试&#xff0c;表现很不好 spring bean生命周期 作用域&#xff08;忘完了&#xff09; 为什么用redis缓存 redis和数据库的缓存一致性问题 redis集群下缓存更新不一致问题 aop说一下 arraylist和linkedlist 数据库的…

2024年软件设计师中级(软考中级)详细笔记【5】软件工程基础知识上(分值10+)

第5章软件工程 目录 前言第5章 软件工程基础知识&#xff08;上&#xff09;&#xff08;分值10&#xff09;5.1 软件工程概述5.1.4 软件过程 5.2 软件过程模型5.2.1 瀑布模型 (Waterfall Model)5.2.2 增量模型5.2.3 演化模型5.2.4 喷泉模型&#xff08;Water Fountain Model&a…

JavaScript下载文件(简单模式、跨域问题、文件压缩)

文章目录 简介简单文件下载通过模拟form表单提交通过XMLHttpRequest方式 跨域(oss)下载并压缩文件完整示例文件压缩跨域设置 简介 相信各位开发朋友都遇到过下载的文件的需求&#xff0c;有的非常简单&#xff0c;基本链接的形式就可以。 有的就比较复杂&#xff0c;涉及跨域…

小米路由器R3Gv2安装openwrt记录

前言 小米路由器R3Gv2的硬件配置与小米路由器4A千兆版一致&#xff0c;但bootloader有所不同&#xff0c;因此openwrt的固件不要互刷。另外&#xff0c;R3Gv2和R3G、4A百兆版是不同的设备&#xff0c;切勿混淆。 硬件信息 OpenWrt参数页-Xiaomi MiWiFi 3G v2 CPU&#xff1a…

PPT分享:埃森哲-业务流程BPM能力框架体系

PPT下载链接见文末~ 业务流程管理&#xff08;BPM, Business Process Management&#xff09;的能力框架体系是一个全面、系统的流程管理方法论和工具集&#xff0c;旨在帮助企业优化和持续改进其业务流程&#xff0c;从而提升运营效率和市场竞争力。 一、BPM能力框架体系概述…

CUDA Example 处理一张二维图像

CUDA 实战 5.3.3 基于共享内存的位图&#xff1a;突出了同步操作的重要性 __synthreads() 才能保证图像的正确输出&#xff0c;如果去掉同步操作&#xff0c;输出图像如下&#xff1a; 加上同步操作之后&#xff1a; #include "cpu_bitmap.h" #include "cpu_an…

小北的技术博客:探索华为昇腾CANN训练营与AI技术创新——Ascend C算子开发能力认证考试(初级)

前言 哈喽哈喽友友们,这里是zyll~(小北)智慧龙阁的创始人及核心技术开发者。在技术的广阔天地里,我专注于大数据与全栈开发,并致力于成为这一领域的新锐力量。通过智慧龙阁这个平台,我期望能与大家分享我的技术心得,共同探索技术的无限可能。 Ascend C编程:小北的技术…

SKG未来健康校招社招入职测评:综合能力及性格问卷SHL测评题库

SKG未来健康科技股份有限公司在校招和社招过程中使用的SHL测评题库主要考察应聘者的综合能力和性格特征。以下是对这些测评的简要分析&#xff1a; 综合能力测评&#xff1a; 测评时间&#xff1a;46分钟&#xff08;实际答题时间36分钟&#xff09; 题目数量&#xff1a;30题…

【操作系统】深入探索:操作系统内核与用户进程的数据交互艺术

目录 一、数据从内核缓冲区拷贝到用户进程缓冲区&#xff0c;是谁来负责拷贝的&#xff0c;是操作系统还是用户进程&#xff1f;实际的执行者到底是谁&#xff1f;二、系统调用以及用户态内核态的相互转换1、系统调用2、用户态内核态的相互转换 三、如何形象的理解linux的虚拟地…

Django学习笔记十三:优秀案例学习

Django CMS 是一个基于 Django 框架的开源内容管理系统&#xff0c;它允许开发者轻松地创建和管理网站内容。Django CMS 提供了一个易于使用的界面来实现动态网站的快速开发&#xff0c;并且具有丰富的内容管理功能和多种插件扩展。以下是 Django CMS 的一些核心特性和如何开始…

Vue 脚手架学习

1.使用 Vue 脚手架 1.1 初始化脚手架 1.1.1 具体步骤 第一步&#xff08;仅第一次执行&#xff09;&#xff1a;全局安装vue/cli。 npm install -g vue/cli 第二步&#xff1a;切换到你要创建项目的目录&#xff0c;然后使用命令创建项目 vue create xxxx 第三步&#xff1a;启…

【CSS Tricks】鼠标滚轮驱动css动画播放,使用js还是css?

目录 引言一、js实现1. 实现思路2. 实现案例3. 看下效果 二、css实现1. 代码修改2. 属性介绍2.1 看下浏览器支持性2.2 常用属性值2.2.1 scroll&#xff08;&#xff09;2.2.2 view&#xff08;&#xff09; 三、总结 引言 本篇为css的一个小技巧 页面中的动画效果随着滚轮的转动…

React技术在Meta Connect 2024大会

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

架构与思维:漫谈高并发业务的CAS及ABA

1 高并发场景下的难题 1.1 典型支付场景 这是最经典的场景。支付过程&#xff0c;要先查询买家的账户余额&#xff0c;然后计算商品价格&#xff0c;最后对买家进行进行扣款&#xff0c;像这类的分布式操作&#xff0c;如果是并发量低的情况下完全没有问题的&#xff0c;但如果…

其他:python语言绘制案例

文章目录 介绍导入python包图1图2 介绍 python语言的科研绘图合集&#xff0c;数据来源Hydrogen-diffusion-and-water-rock-reaction 导入python包 import pandas as pd import glob import proplot as pplt import seaborn as sns import numpy as np import matplotlib.py…

基于 Prometheus+Grafana+Alertmanager 搭建 K8S 云监控告警平台(附配置告警至QQ、钉钉)

文章目录 一、机器规划二、部署安装 node-exporter、prometheus、Grafana、kube-state-metrics1、创建 monitor-sa 命名空间2、安装node-exporter组件2.1、说明2.2、应用资源清单2.3、通过node-exporter采集数据 3、k8s 集群中部署 prometheus3.1、创建一个 sa 账号3.2、将 sa …

element-ui的树形结构样式调整,添加线条和边框样式

element-ui的树形结构样式调整&#xff0c;添加线条和边框样式 先看图效果&#xff1a; <template><div class"temperature_monitoring"><div class"temperature_monitoring_left"><div class"tree-container"><e…

鸿蒙NEXT开发-动画(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…