node.js 学习 -- koa

news2025/1/11 18:05:12

一、搭建项目

1. 安装 Koa 框架

yarn add koa

2. 引入

const Koa = require("koa");
const app = new Koa();

3. 配置中间件

// ctx 所有http的上下文
// 配置中间件
app.use((ctx, next) => {
  ctx.body = "hello api";
});

4. 监听端口

app.listen(3000, () => {
  console.log("Server on 3000");
});

二、项目基本优化

1. 配置文件

安装 dotenv 包

yarn add dotenv

创建 .env 文件

APP_PORT = 8000

在当前目录下创建 config 文件夹,用来保存配置文件,并添加config.default.js

const dotenv = require("dotenv")
dotenv.config()
// 暴露
module.exports = process.env

改写 主进程内容

// 引包
const Koa = require("koa");
const app = new Koa();
// env
const { APP_PORT } = require("./config/config.default");
// ctx 所有http的上下文
// 配置中间件
app.use((ctx, next) => {
  ctx.body = "hello api";
});
app.listen(APP_PORT, () => {
  console.log("Server on 3000");
});

三、添加路由(处理不同的url请求)

路由:根据不同的 URL,调用对应处理函数

1. 安装 koa-router

yarn add koa-router

koa-router 官方文档

步骤:

  1. 导入包
  2. 实例化对象
  3. 编写路由
  4. 注册中间件

2. 导入包

const Router = require("koa-router")

3. 实例化对象

const indexRouter = new Router()

4. 编写路由

indexRouter.get('/',(ctx,next)=>{    ctx.body = "hello index"})

5. 注册中间件

app.use(indexRouter.routes())

这里需要特别注意的是,配置中间件的时候需要调用 routes 方法,不能直接传入对象

app.use(indexRouter) // 错误

会报错

四、处理路由文件

如果我们要将全部的路由文件写在 main.js 文件中,会造成代码的混乱,这一点在 express 中也遇到了,我们可以将路由请求放在一个单独的文件夹中router,分别处理不同场景的路由

1. 引入包

例如我们需要一个专门处理用户路由的文件 user.route.js ,这个文件专门处理用户路由

同时一个很重要的点:我们可以给 Router 构造函数传递一个对象{prefix: "/users"} ,用来配置请求的前缀

const router = new Router({ prefix: "/users" });

这样配置后,当我们请求 /路径时,实际上请求的是 /users/

2. 编写路由

我们在 user.route.js 中编写路由

const Router = require("koa-router");const router = new Router({ prefix: "/users" });router.get("/", (ctx, next) => {  ctx.body = " hello users";});

并暴露出 router

module.exports = router;

3. 改写 main.js

将暴露的 router 引入 main.js 中,引入中间件即可

// 引包const Koa = require("koa");const app = new Koa();// envconst { APP_PORT } = require("./config/config.default");const userRouter = require("./router/user.route")// 配置中间件app.use(userRouter.routes()) // 新增app.listen(APP_PORT, () => {  console.log("Server on 8000");});

五、 优化目录结构

1. 将 Http 服务和 app 业务拆分

在 src 目录下创建 app 文件夹,用来处理业务

新增一个 index.js 文件,将 main.js 入口文件中的部分代码移植到这里

// 引包const Koa = require("koa");const app = new Koa();const userRouter = require("../router/user.route");// 配置中间件app.use(userRouter.routes());module.exports = app

改写 main.js 优化了代码

const app = require("./app/index");// 读取env配置const { APP_PORT } = require("./config/config.default");app.listen(APP_PORT, () => {  console.log("Server on 8000");});

2. 将路由和控制器拆分

路由:解析 URL,分发给控制器对应的方法

控制器:处理业务

改写 user.route.js

用来匹配路径

const Router = require("koa-router");// 导入控制器接口const { register ,login} = require("../controller/user.controller");const router = new Router({ prefix: "/users" });// 注册接口router.post("/register", register);// 登录接口router.post("/login",login)module.exports = router;

改写 user.controller.js

将路由的请求处理函数写在这个文件中

class UserController {  async register(ctx, next) {    ctx.body = "注册接口";  }  async login(ctx, next) {    ctx.body = "登录接口";  }}module.exports = new UserController();

通过创建一个类的方式,再返回一个实例化的对象,就可以调用对应的函数了

六、解析 body

1. 安装 koa-body

yarn add koa-body

2. 注册中间件

const Koa = require("koa");// 注册中间件app.use(KoaBody())

3. 解析请求数据

通过 request.body 来获取数据

const { user_name, password } = ctx.request.body;ctx.body = ctx.request.body;

4. 拆分 service 层

专门用来操作数据库

在文件目录下创建一个 service 文件夹,用来存放 service 文件

class UserService {    async createUser(user_name,password) {        return '写入成功'    }}module.exports = new UserService()

换个视频看,这个视频偏向实战,不够系统

koa 学习(二)

B站视频:Node框架koa从入门到实战写接口(2021)

编写一个接口

首先和 express 一样,我们需要建立 app.js 入口文件,routes 管理路由接口,model 创建模型

1. 入口文件

 app.js 中编写主程序

// app.js// 引入依赖const koa = require("koa");const Router = require("koa-router");const mongoose = require("mongoose");const bodyParser = require("koa-bodyparser");// 实例化const app = new koa();const router = new Router();// 配置post 中间件app.use(bodyParser());// 引入 api 模块const users = require("./routes/api/user");// 配置路由地址router.use("/api/users", users);// 配置路由app.use(router.routes()).use(router.allowedMethods());// 监听端口app.listen(3000, () => {  console.log("3000启动");});

一定要配置中间件,不然会 not Found

app.use(router.routes()).use(router.allowedMethods());

注意:这里的router.use 第一个参数,设置的是路由地址前缀api/users

我们要访问 /test 时,需要访问 /api/users/test

2. 数据模型

在 model 中创建 User.js 文件,用来连接数据库,处理用户数据模型

const UserSchema = new Schema({  name: {    type: String,    required: true,  },  password: {    type: String,    required: true,  },  email: {    type: String,    required: true,  },  avatar: {    type: String,    required: true,  },  data: {    type: Date,    default: Date.now,  },});module.exports = mongoose.model("User", UserSchema);

3. 路由处理

引入 router 挂载路由即可

const Router = require("koa-router");const router = new Router();// 引入 User modelconst User = require("../../models/User");// 路由router.get("/test", async (ctx) => {  ctx.status = 200;  ctx.body = {    msg: "hello",  };});

4. 巨坑点

当我们使用测试工具测试邮箱时,我们填写邮箱时尽量不要打 .com 不然会被解析成对象,导致数据出错

. 去掉

测试工具采用 postman ,body 选择 x-www-form-unlencoded

数据加密

采用 bcryptjs 来进行数据加密

yarn add bcryptjs

引入

const bcrypt = require("bcryptjs")

使用

await bcrypt.genSalt(10, function (err, salt) {    bcrypt.hash(newUser.password, salt, function (err, hash) {    if (err) {        throw err;    }    newUser.password = hash;    });});

传入我们的密码,然后更改实例对象的数据

存在问题,我们在控制台上打印处理的数据是加密的,但是在数据库中的仍然是明文

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

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

相关文章

TPO69 01|Why Snakes Have Forked Tongues|阅读真题精读|10:40-11:40+15:30-16:57

Why Snakes Have Forked Tongues 5/10 目录 Why Snakes Have Forked Tongues P1 P1生词 P1段落大意 无题目 P2 P2生词 P2段落大意 P2题目 【1】词汇题 secreteproduce ✅ 【2】事实信息题|考频高|难度高|定位错误​ P34​ P34生词 P34段落大意 P34题目 【3】词汇题 simultaneo…

入理解深度学习——正则化(Regularization):提前终止(Early Stopping)

分类目录:《深入理解深度学习》总目录 当训练有足够的表示能力甚至会过拟合的大模型时,我们经常观察到,训练误差会随着时间的推移逐渐降低但验证集的误差会再次上升。下图是这些现象的一个例子,这种现象几乎一定会出现。 这意味…

RT-Thread 学习笔记:memheap 死机问题的分析与解决

验证环境 NUCLEO-L476RG 开发板,板载 STM32L476RGT6(96K SARM1 32K SRAM2) Win10 64 位 Keil MDK 5.36 RT-Thread 5.0.1 版本(2023-05-28 master 主线) bsp : bsp\stm32\stm32l476-st-nucleo 功能描述 最近在研…

机器学习-线性代数-矩阵与空间映射

矩阵 文章目录 矩阵直观理解特殊矩阵矩阵的基本运算矩阵( A A A)乘向量( x x x)的本质:改变空间位置矩阵:空间映射关系矮胖矩阵对空间的降维压缩高瘦矩阵无法覆盖目标空间方阵映射矩阵的秩 直观理解 一个 m n m \times n mn的大小矩阵,直观…

fastjson与lombok一起用出现序列化问题

文章内部信息已脱敏。 有一次在测试环境调用网易电子签章平台的接口,用来生成印章图片。 首先用postman去测试接口,除了必传的固定请求头,请求体参数如下: {"userId": "***********","templateType&qu…

数据在内存中是如何存储的?(上)

C语言进阶——数据在内存中是如何存储的? 一. 整型数据的二进制表示二.数据类型详细介绍1.1 类型的基本归类1.2认识有无符号的区别( signed 和 unsigned )1.3代码理解一:1.4代码二理解:1.5代码三理解:1.6代…

【P40】JMeter 录制控制器(Recording Controller)

文章目录 一、录制控制器(Recording Controller)二、准备工作三、测试计划设计 一、录制控制器(Recording Controller) 可以理解为一个占位符,用来告诉代理服务器将脚本录制到何处,本身无任何逻辑作用&…

AI时代来临,新时代程序员如何紧追时代的风口浪尖?

文章目录 背景AI时代的背景和机遇抓住AI时代的机遇新时代程序员的技能和素质实践建议和资源总结 背景 在这个快速发展的AI时代,程序员们正置身于科技革新的前沿。随着人工智能技术的蓬勃发展和广泛应用,程序员的作用变得愈发重要和关键。他们不再是简单…

Doris之rollup上卷及物化视图

Rollup上卷 通过建表语句创建出来的表称为 Base 表(Base Table,基表) 在 Base 表之上,我们可以创建任意多个 ROLLUP 表。这些 ROLLUP 的数据是基于 Base 表产生的,并且在物理上是独立存储的。 Rollup表的好处: 和基表…

如何在华为OD机试中获得满分?Java实现【最长的连续子序列】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

如何在华为OD机试中获得满分?Java实现【滑动窗口】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

软件测试理论----接口测试中restful接口状态码规范

一、restful接口状态码总体分类 类别描述1xx:信息通信传输协议信息2xx:成功表示客户端的请求已成功接受3xx:重定向表示客户端必须执行一些其他操作才能完成其请求4xx:客户端错误此类错误状态码指向客户端5xx:服务器错…

在SPSS Statistics中使用R(插件)

date: 2018-10-30 09:26:33 在SPSS中使用R(插件) 谷歌或者百度“SPSS中调用R”, 最详细也是最靠谱的就是IBM SPSS社区的这两篇文章: https://www.ibm.com/developerworks/cn/data/library/ba/ba-1401spss-r/https://www.ibm.com/developerworks/cn/ana…

基于Open3D的点云处理6-点云去噪

当我们从扫描设备获取点云数据时,数据会包含噪声和伪影,点云噪声特性包括不真实的点、孤立点、不规则,基于噪声特性对器进行去除; 统计滤波 Statistical Outlier Removal(SOR)(去除离群点&…

【JVM】13. 垃圾回收器

文章目录 13.1. GC分类与性能指标13.1.1. 垃圾回收器概述13.1.2. 垃圾收集器分类13.1.3. 评估GC的性能指标吞吐量暂停时间吞吐量 vs 暂停时间 13.2. 不同的垃圾回收器概述13.2.1. 垃圾回收器发展史13.2.2. 7种经典的垃圾收集器13.2.3. 7款经典收集器与垃圾分代之间的关系13.2.4…

前端自动化测试 —— Jest 测试框架应用

目录​​​​​​​ 什么是自动化测试 为什么要用前端自动化测试 前端自动化分类和思想 单元测试 集成测试 TDD 测试驱动开发(Test Driven Development) BDD 行为驱动开发(Behavior Driven Development) 如何自己写非框架…

分布式软件架构——SOA架构/微服务架构/无服务架构

SOA架构 Service-Oriented Architecture,面向服务的架构。面向服务的架构是一次具体地、系统性地成功解决分布式服务主要问题的架构模式。了解SOA架构前,先了解三种比较有代表性的服务拆分的架构模式,这些架构模式是SOA演化过程的中间产物&a…

偷偷曝光下国内这些软件外包公司!(2023 最新版)

ChatGPT狂飙160天,世界已经不是之前的样子。 我新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 根据网上的资料,整理出来的一份国内软件外包公司的名单。 找工作的同学都要看看,根据自身的情况&#…

杰理AC632N实现custom hid

1. 设备描述符修改 设备描述符主要修改的是PID、VID、设备发现版本号以及字符串描述。 static const u8 sDeviceDescriptor[] { //<Device DescriptorUSB_DT_DEVICE_SIZE, // bLength: Size of descriptorUSB_DT_DEVICE, // bDescriptorType: Device #if defi…

langchain简版教程附案例

简介 LangChain是一个开源的应用开发框架。基于该开源框架&#xff0c;我们可以把大模型与各种工具结合从而实现各种功能&#xff0c;比如基本文档的问答&#xff0c;解析网页内容、查询表格数据等。目前支持Python和TypeScript两种编程语言。当前Python框架支持的模型和功能最…