Node 中基于 Koa 框架的 Web 服务搭建实战

news2024/11/27 23:47:04

前言

在《Node之Web服务 - 掘金 (juejin.cn)》一文中,我们使用 HTTP 模块构建了后端接口,从而实现了后端服务的开发。可以对此进行进一步优化

  • http模块代码回顾
const http = require("http");

const server = http.createServer((req, res) => {
  if (reqUrl.pathname === "/") {
    res.writeHead(200, {
      "Content-Type": "text/html; charset=utf8",
    });
    res.end("/");
  } else if (reqUrl.pathname === "/user") {
    res.writeHead(200, {
      "Content-Type": "application/json; charset=utf8",
    });
    res.end("/user");
  } else if (reqUrl.pathname === "/login" && req.method === "POST") {
    res.end("login success");
  } else {
    res.end("errer");
  }
});

server.listen(3000, () => {
  console.log("server is running at http://127.0.0.1:3000");
});
  1. 引入模块:

    • const http = require("http");: 引入 Node.js 的 HTTP 模块,用于创建 HTTP 服务。
  2. 创建 HTTP 服务:

    • const server = http.createServer((req, res) => { ... });: 使用 http.createServer() 方法创建一个 HTTP 服务器,并传入一个回调函数。
    • 这个回调函数会在每次接收到 HTTP 请求时被调用,reqres 分别代表请求对象和响应对象。
  3. 处理路由:

    • 根路径 / 的请求:if (reqUrl.pathname === "/") { ... }

      • 设置响应头的 Content-Type"text/html; charset=utf8"
      • 使用 res.end("/") 返回响应内容 /
    • /user 路径的请求:else if (reqUrl.pathname === "/user") { ... }

    -   设置响应头的 `Content-Type` 为 `"application/json; charset=utf8"`。
    -   使用 `res.end("/user")` 返回响应内容 `/user`。
    
    • /login 路径的 POST 请求:else if (reqUrl.pathname === "/login" && req.method === "POST") { ... }
    -   使用 `res.end("login success")` 返回响应内容 `"login success"`。
    
    • 其他未定义的路径请求:else { ... }

      • 使用 res.end("error") 返回响应内容 "error"
  4. 启动服务:

    • server.listen(3000, () => { ... });: 在 3000 端口启动 HTTP 服务,并在控制台输出服务启动信息。

以上是基础的使用Node.js 的原生 HTTP 模块创建了一个简单的 Web 服务

接下来我们就使用koa框架去搭建一个服务

Koa框架构建服务

这里首先介绍一下什么是koa框架

Koa 是一个新的 web 框架,由 Express 的原班人马打造,致力于成为 web 应用和 API 开发领域更小、更富有表现力和更健壮的基石

Koa 利用 async 函数丢弃了回调函数,并提供了上下文统一的 API,使得编写 web 应用变得更加优雅、简洁和富有表现力

Koa 框架的一些主要特点包括:

  1. 基于 async/await 的异步处理机制:

    • Koa 使用 async/await 语法取代了传统的回调函数,使得代码更加简洁和易读。
  2. 中间件机制:

    • Koa 采用"洋葱模型"的中间件机制,中间件按照顺序执行,并可以控制请求/响应的流程。
  3. 上下文对象 (Context) :

    • Koa 提供了一个 Context 对象,封装了 Node.js 原生的 request 和 response 对象,使得开发者可以更方便地访问和操作请求/响应相关的信息。
  4. 轻量级和可扩展性:

    • Koa 的核心库非常小,但可以通过第三方中间件进行扩展,满足各种复杂的业务需求。
  5. 优雅的错误处理:

    • Koa 提供了优雅的错误处理机制,可以集中处理应用程序中的各种异常。
  6. 路由管理:

    • Koa 没有内置路由功能,但可以通过第三方路由中间件,如 koa-router,来管理路由。

第一步首先我们需要引入依赖

npm i koa
npm i koa-router

接下来我们要去构建一个路由

这个也就是需要创建的接口

user.js

const router = require('koa-router')()

router.get('/user', async (ctx, next) => {
    ctx.body = {
        name: 'user',
        age: 18
    }
})

router.get('/home', async (ctx, next) => {
    ctx.body = {
        name: 'home',
        age: 18
    }
})

module.exports = router

这里创建了两个接口,分别是/user和/home

然后构建服务,并将路由传入

app.js

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

const userRouter = require('./routers/user');
app.use(userRouter.routes());

app.listen(3000, () => {
    console.log('server is running at http://127.0.0.1:3000');
});

使用 Koa 创建了一个 Web 服务,并将路由定义和处理逻辑封装在了一个单独的 user 路由模块中。在主应用中,通过 app.use(userRouter.routes()) 将路由模块注册到了 Koa 应用中。

接下来我们运行app.js服务

image.png

接下来我们就去访问一下这两个接口

/user接口

image.png

/home接口

image.png

可见这两个接口都是访问成功的,Koa 框架书写接口更加的优雅

总结

本文讲解了如何使用koa框架,使用这个框架来构建后端项目,以及接口的书写都更加简洁、清晰和易维护

开发者可以利用 Koa 的这些优势,构建出简洁、灵活、可扩展的后端应用程序

相信看到这里的你一定会有所收获的!!!!赶紧构建一个属于自己的后端服务吧!!!!

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

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

相关文章

Simulated Annealing

模拟退火最大值算法: 初始化起始解 x 0 x_0 x0​ 、温度 t 0 t_0 t0​ 以及迭代次数 steps,计算初始值 y 0 y_0 y0​扰动产生新解 x 1 x_1 x1​, 计算对应函数值 y 1 y_1 y1​依据 Δ y y 1 − y 0 \Delta y y_1 - y_0 Δyy1​−y0​ 决策是否接…

element-ui输入框如何实现回显的多选样式?

废话不多说直接上效果&#x1f9d0; 效果图 <template><div><el-form:model"params"ref"queryForm"size"small":inline"true"label-width"68px"><el-form-item label"标签" prop"tag&q…

CurrentHashMap巧妙利用位运算获取数组指定下标元素

先来了解一下数组对象在堆中的存储形式【数组长度&#xff0c;数组元素类型信息等】 【存放元素对象的空间】 Ma 基础信息实例数据内存填充Mark Word,ClassPointer,数组长度第一个元素第二个元素固定的填充内容 所以我们想要获取某个下标的元素首先要获取这个元素的起始位置…

UEC++ 虚幻5第三人称射击游戏(二)

UEC++ 虚幻5第三人称射击游戏(二) 派生榴弹类武器 新建一个继承自Weapon的子类作为派生榴弹类武器 将Weapon类中的Fire函数添加virtual关键字变为虚函数让榴弹类继承重写 在ProjectileWeapon中重写Fire函数,新建生成投射物的模版变量 Fire函数重写逻辑 代码//生成的投射物U…

使用Spring Boot和自定义缓存注解优化应用性能

在现代应用开发中&#xff0c;缓存是提高系统性能和响应速度的关键技术之一。Spring Boot提供了强大的缓存支持&#xff0c;但有时我们需要更灵活的缓存控制。本文将介绍如何使用Spring Boot和自定义缓存注解来优化应用性能。 1. 为什么需要自定义缓存注解&#xff1f; Sprin…

CH12_函数和事件

第12章&#xff1a;Javascript的函数和事件 本章目标 函数的概念掌握常用的系统函数掌握类型转换掌握Javascript的常用事件 课程回顾 Javascript中的循环有那些&#xff1f;Javascript中的各个循环特点是什么&#xff1f;Javascript中的各个循环语法分别是什么&#xff1f;…

Android仿今日头条新闻(一)

新建一个侧边栏的文件&#xff0c;创建成功后直接运行。可以看到带滑动的侧边栏功能如图所示&#xff1a; 主体UI&#xff1a; 新闻UI的实现: 侧边栏&#xff1a; 更换一下颜色&#xff1a; 学习参考-浩宇开发

科研绘图系列:R语言两组数据散点分布图(scatter plot)

介绍 展示两组数据的散点分布图是一种图形化表示方法,用于显示两个变量之间的关系。在散点图中,每个点代表一个数据点,其x坐标对应于第一组数据的值,y坐标对应于第二组数据的值。以下是散点图可以展示的一些结果: 线性关系:如果两组数据之间存在线性关系,散点图将显示出…

【JVM系列】Full GC(完全垃圾回收)的原因及分析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

IDA*——AcWing 180. 排书

IDA* 定义 IDA*&#xff08;Iterative Deepening A*&#xff09;是一种结合了深度优先搜索&#xff08;DFS&#xff09;的递归深度限制特性和A搜索的启发式估价函数的搜索算法。它主要用于解决启发式搜索问题&#xff0c;尤其是当搜索空间很大或者搜索成本不确定时。 IDA* 是…

分享大厂对于缓存操作的封装

hello&#xff0c;伙伴们好久不见&#xff0c;我是shigen。发现有两周没有更新我的文章了。也是因为最近比较忙&#xff0c;基本是993了。 缓存大家再熟悉不过了&#xff0c;几乎是现在任何系统的标配&#xff0c;并引申出来很多的问题&#xff1a;缓存穿透、缓存击穿、缓存雪崩…

markdown导入其它markdown文件

相应语法 [toc] # 测试不同功能 <p> 这是类似超链接的管理方式 </p>[链接测试0](./part0/uml_base.md)[链接测试1](./part1/math_base.md)---<p> 这是直接导入文件的管理方式 </p>import "./part0/uml_base.md"---import "./part1/mat…

arm64架构kvm情景分析 - type1型和type2型虚拟机管理器

内核版本&#xff1a;linux-v5.9 架构&#xff1a;arm64 1 type1型和type2虚拟机管理器 在arm64架构中&#xff0c;共有EL3到EL0四个异常级别&#xff0c;EL3异常级别最高。通常操作系统&#xff08;如linux&#xff09;运行在EL1&#xff0c;应用程序运行在EL0&#xff0c;EL…

S32DS S32 Design Studio for S32 Platform 3.5 代码显示行号与空白符

介绍 NXP S32DS&#xff0c;全称 S32 Design Studio&#xff0c;s32 系列芯片默认使用 S32 Design Studio for S32 Platform 作为 IDE 集成开发环境&#xff0c;当前版本 S32 Design Studio for S32 Platform 3.5&#xff0c;IDE 可以简称 s32DS 使用 S32DS&#xff0c;可以认…

python操作SQLite3数据库进行增删改查

python操作SQLite3数据库进行增删改查 1、创建SQLite3数据库 可以通过Navicat图形化软件来创建: 2、创建表 利用Navicat图形化软件来创建: 存储在 SQLite 数据库中的每个值(或是由数据库引擎所操作的值)都有一个以下的存储类型: NULL. 值是空值。 INTEGER. 值是有符…

JavaWeb开发基础7个Web术语解析

7个Web术语 Website: static vs dynamic HTTP HTTP Requests GET vs POST Servlet Container Server: Web vs Application Content Type Website: static vs dynamic 网站内容包括文本、图片、音频、视频&#xff0c;通过URL来访问。网站分为静态网站和动态网站。 静态网…

LLMs之gptpdf:gptpdf的简介、安装和使用方法、案例应用之详细攻略

LLMs之gptpdf&#xff1a;gptpdf的简介、安装和使用方法、案例应用之详细攻略 目录 gptpdf的简介 1、处理流程 第一步&#xff0c;使用 PyMuPDF 库&#xff0c;对 PDF 进行解析出所有非文本区域&#xff0c;并做好标记&#xff0c;比如: 第二步&#xff0c;使用视觉大模型&…

【数智化人物展】天云数据CEO雷涛:大模型连接数据库 为数智化提供高价值数据...

雷涛 本文由天云数据CEO雷涛投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 这几天&#xff0c;奥特曼讲SQL数据库和大模型结合起来会产生什么样的化学变化引起行业关注。为…

13.SQL注入-宽字节

SQL注入-宽字节 含义&#xff1a; MySQL是用的PHP语言&#xff0c;然后PHP有addslashes()等函数&#xff0c;这类函数会自动过滤 ’ ‘’ null 等这些敏感字符&#xff0c;将它们转义成’ ‘’ \null&#xff1b;然后宽字节字符集比如GBK它会自动把两个字节的字符识别为一个汉…

frp技术

说明&#xff1a;frp&#xff08;https://github.com/fatedier/frp&#xff09; 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露…