Koa2+mongodb项目实战1(项目搭建)
前言
在正式开始之前,需要先知道用到的东西:
koa
:Koa 是一个基于 Node.js 的 Web 应用框架,非常适合开发API服务,可以与前端框架(如 Vue.js、React.js)结合使用,实现前后端分离的开发模式。koa-router
:是一个用于在 Koa 框架中实现路由功能的模块。koa-body
:是一个用于 Koa 框架的中间件,它主要用于处理 HTTP 请求中的请求体。
文档:
Koa中文文档
koa-router NPM
koa-router API
koa-body NPM
Koa 是一个基于 Node.js 的 Web 应用框架,由 Express 原班人马打造。
Koa 并没有捆绑任何中间件,而是提供了一套优雅的方法,帮助开发者快速地编写服务端应用程序。
项目初始化
创建一个文件夹:ko2-mongodb
打开文件夹,初始化项目,生成一个package.json
文件:
npm init -y
这个命令会自动创建一个 package.json
文件,该文件是 Node.js 项目的配置文件,包含了项目的名称、版本、依赖项、脚本等重要信息。
通过 -y
(或 --yes
)参数,命令会自动使用默认值填充 package.json
,无需手动回答一系列问题。
如果需要在本地git仓库对项目版本做管理,可以初始化git:
git init
在项目根目录下新建一个.gitignore
文件,让项目的某些文件不要提交到git仓库:
node_modules
项目搭建
安装Koa框架:
npm install koa
安装成功,在package.json
中会显示依赖信息:
创建src/main.js
,编写代码:
// 导入koa, koa是一个类
const Koa = require('koa')// 创建koa实例对象:app
const app = new Koa()// 使用 app.use() 方法添加中间件,且只能写一个中间件
// 注意:app.use 只能接收函数作为参数
app.use((ctx, next) => {// 中间件逻辑ctx.body = 'hello Koa!'
});// 指定端口号并启动服务器
const port = 3000 // 表示服务器将监听的端口号
app.listen(port, () => {console.log('server is running on http://localhost:3000')
})
-
app.use()
:用于向应用添加中间件- 语法:
app.use(middleware)
middleware
是一个函数,它接收两个参数ctx
(上下文对象)和next
(一个函数,用于调用下一个中间件)。ctx
包含了请求和响应的信息,可以通过它访问请求对象ctx.request
和响应对象ctx.response
。例如,在中间件中修改ctx.body
来设置响应内容,或者通过ctx.params
获取路由参数等。next
函数用于调用下一个中间件。当在一个中间件中调用next()
时,Koa 会暂停当前中间件的执行,将请求传递给下一个中间件。当后续的中间件都执行完毕后,Koa 会回溯回来继续执行当前中间件中next()
之后的代码。
- 如果
app.use
接收到的middleware
不是函数,执行运行命令后,在终端会报错:
- 语法:
-
app.listen()
:用于启动服务器并在指定的端口上监听传入的连接。- 调用这个方法后,服务器开始在指定的端口上监听传入的 HTTP 请求。当有请求到达时,Koa 会根据注册的中间件依次处理请求,并生成响应返回给客户端。
- 语法:
app.listen(port, [hostname], [backlog], [callback])
port
:必选参数,服务器要监听的端口号。hostname
:可选参数,服务器要监听的主机名。默认是'0.0.0.0'
,表示监听所有的网络接口。backlog
:可选参数,指定连接队列的最大长度。默认是511
。callback
:可选参数,服务器启动后要执行的回调函数。如果提供了回调函数,它会在服务器成功启动后被调用。这个回调函数通常用于输出一些启动成功的信息或者执行其他初始化操作。
在终端执行指令,启动服务:
node src/main.js
在这个例子中,main.js
文件中使用了 Koa 框架创建了一个服务器,设置一个简单的中间件,并设置了服务器监听的端口为 3000,执行node src/main.js
指令后,服务器就会在本地的 3000 端口上运行,当有请求到达时,会返回 'hello Koa!'
作为响应内容。
命令行终端输出:
按住CTRL+单击
,可以打开链接http://localhost:3000
node src/main.js
用于使用 Node.js 运行位于 src
目录下的 main.js
文件。
这条指令的作用通常是启动一个基于 Node.js 的应用程序。如果 main.js
文件中包含了服务器的设置、路由定义、中间件的使用等代码,执行这个指令后,就会启动相应的服务,可能是一个 Web 服务器、API 服务或者其他类型的后端服务。
注意:
修改main.js
后,必须停掉服务,重新执行node src/main.js
,刷新页面,页面才会更新!
所以在实际项目中,是不会使用node命令来直接启动的。
现在,项目的目录结构如下图所示:
配置项目自动重启
安装nodemon
:
npm i nodemon -D
安装完毕后,配置package.json
:
"scripts": {"dev": "nodemon ./src/main.js",
},
接下来,就可以执行npm run dev
启动服务:
执行命令npm run dev
,本质上是使用 nodemon
来监控文件变化并自动重启服务器。
[nodemon] 3.1.7
,表示正在使用的nodemon
版本是3.1.7
。[nodemon] to restart at any time, enter 'rs'
,表示可以在任何时候输入rs
来手动重启nodemon
。nodemon
正在监控的路径和文件扩展名:[nodemon] watching path(s): *.*
和[nodemon] watching extensions: js,mjs,cjs,json
,表示nodemon
正在监控所有路径下的.js
、.mjs
、.cjs
和.json
文件。nodemon
启动服务器的命令:[nodemon] starting 'node./src/main.js'
,表示nodemon
正在启动node
进程来执行./src/main.js
文件。
服务器成功启动并输出了 server is running on http://localhost:3000
,表示服务器正在监听本地的 3000
端口。
读取配置文件
dotenv
:一个用于读取 Node 环境变量的工具库。
dotenv
是一个 npm
包,用于加载 .env
文件中定义的环境变量赋值给到 process.env
中。
process.env
是 Node.js 程序在运行时能访问到的一个全部变量,存储环境变量信息。
dotenv 中文网
dotenv
安装dotenv
:
npm install dotenv -D
在项目的根目录下创建一个 .env
文件:
APP_PORT=8080
创建config/config.env.js
文件:
// 引入dotenv,注意:dotenv 是一个对象
const dotenv = require('dotenv')
dotenv.config()// 将当前进程的环境变量对象 process.env 导出
// process: 当前执行的node的进程
// env: 环境变量
module.exports = process.env
const dotenv = require('dotenv')
:这行代码引入了 dotenv
模块。dotenv
是一个用于在 Node.js 应用中加载环境变量的模块。
dotenv.config()
:调用 dotenv.config()
方法来加载环境变量配置文件。
- 通常,这个方法会查找项目根目录下的
.env
文件,并将其中定义的环境变量加载到前进程的process.env
对象中。 - 环境变量可以在应用中通过
process.env.VARIABLE_NAME
的方式来访问。
module.exports = process.env
:这里将当前进程的环境变量对象 process.env
导出。这样,其他模块在引入这个模块时,就可以直接访问当前进程的环境变量。
改写main.js
:
// 导入koa, koa是一个类
const Koa = require('koa')const { APP_PORT } = require('./config/config.env')// 创建koa实例对象:app
const app = new Koa()// 使用 app.use() 方法添加中间件,且只能写一个中间件
app.use((ctx, next) => {console.log(`Request received: ${ctx.request.method} ${ctx.request.url}`);// 中间件逻辑ctx.body = 'hello Koa!'
});// 指定端口号并启动服务器
app.listen(APP_PORT, () => {console.log(`server is running on http://localhost:${APP_PORT}`)
})
执行npm run dev
启动服务:
按住CTRL+单击
,打开链接http://localhost:8080
:
项目的目录结构如下图所示:
相关文章:

Koa2+mongodb项目实战1(项目搭建)
前言 在正式开始之前,需要先知道用到的东西: koa:Koa 是一个基于 Node.js 的 Web 应用框架,非常适合开发API服务,可以与前端框架(如 Vue.js、React.js)结合使用,实现前后端分离的开…...

Pyhton爬虫使用Selenium实现浏览器自动化操作抓取网页
第三方库Selenium主要是用来抓取动态生成的网页数据,有些网站的内容要下拉网页才会动态加载,特别是那些使用javaScript渲染的内容。当然Selenium还可用于自动化浏览器操作,比如编写一个自动抢火车票的python脚本,这并不难实现。接…...

矩阵学习过程中的一些思考
2024.09.27(学习鸢尾花书_矩阵力量_Ch20) (1)所有中心过原点的椭圆都可以用一个二维矩阵表示,且特征值表示长短轴长度,特征向量表示长短轴所在方向的单位向量(表征椭圆旋转方向)&am…...

初识Django
前言: 各位观众老爷们好,最近几个月都没怎么更新,主要是最近的事情太多了,我也在继续学习Django框架,之前还参加了一些比赛,现在我会开始持续更新Django的学习,这个过程会比较久,我会把我学习的…...

VirtualBox虚拟机连接宿主机并能够上网(小白向)
现存问题 windows系统主要使用vmare和virtualbox两种虚拟机,virtualbox相对于vmare更加轻便,但少有博客能够详细说明使用virtualbox的教程。踩了网上的坑后,决定写一篇文章介绍virtualbox虚拟机上网的流程。 需求 1. virtualbox虚拟机与宿主机…...

深度学习每周学习总结J1(ResNet-50算法实战与解析 - 鸟类识别)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 0. 总结1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数:定义损失函数,学习率&a…...

商家营销工具架构升级总结
今年以来,商家营销工具业务需求井喷,需求数量多且耗时都比较长,技术侧面临很大的压力。因此这篇文章主要讨论营销工具前端要如何应对这样大规模的业务需求。 问题拆解 我们核心面对的问题主要如下: 1. 人力有限 我们除了要支撑存量…...

移动硬盘无法读取:问题解析与高效数据恢复实战
一、移动硬盘无法读取的困扰 在数字化时代,移动硬盘作为数据存储和传输的重要媒介,承载着大量珍贵的数据资源。然而,当移动硬盘突然无法读取时,我们往往会陷入深深的困扰之中。这种无法读取的现象可能表现为插入电脑后毫无反应、…...

20241005给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时使用iperf3测网速
20241005给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时使用iperf3测网速 2024/10/5 14:06 对于荣品RD-RK3588-AHD开发板,eth1位置上的PCIE转RJ458的以太网卡是默认好用的! PCIE TO RJ45:RTL8111HS 被识别成为eth0了。inet addr:192.…...

node配置swagger
安装swagger npm install swagger-jsdoc swagger-ui-express 创建 swagger.js 配置文件 const path require(path); const express require(express); const swaggerUI require(swagger-ui-express); const swaggerJsDoc require(swagger-jsdoc); // 修改 swaggerDoc…...

MATLAB plot画线的颜色 形状
文章目录 前言一、MATLAB plot画线的颜色 形状?颜色选项标记选项示例代码详细说明 总结 前言 提示:这里可以添加本文要记录的大概内容: 项目需要: 提示:以下是本篇文章正文内容,下面案例可供参考 一、MA…...

Goland使用SSH远程Linux进行断点调试 (兼容私有库)
① 前置需求 ssh远程的 Linux 服务器必须安装 高于本地的 Go推荐golang 安装方式使用 apt yum snap 等系统自管理方式,(要安装最新版本的可以找找第三方源),如无特殊需求不要自行编译安装golang ② Goland设置 2.1、设置项处理…...

LLM | Ollama WebUI 安装使用(pip 版)
Open WebUI (Formerly Ollama WebUI) 也可以通过 docker 来安装使用 1. 详细步骤 1.1 安装 Open WebUI # 官方建议使用 python3.11(2024.09.27),conda 的使用参考其他文章 conda create -n open-webui python3.11 conda activate open-web…...

Three.js基础内容(一)
目录 一、几何体顶点和模型 1.1、点模型对象(Points)渲染顶点数据 1.2、线模型(Line)渲染顶点数据(画个心) 1.3、网格模型(Mesh)渲染顶点数据(三角形概念) 1.4、构建一个矩形平面几何体 1.5、几何顶点索引数据 1.6、顶点法线数据 1.7、查看three…...

网站建设制作需要注意
网站建设制作不仅仅是简单的技术活,更是一个企业或个人在互联网上展示自己形象和实力的重要手段。本文将探讨网站建设制作的重要性、步骤和关键要素。 1. 网站建设的重要性 1.1 品牌形象与宣传 一个精心设计的网站能够突显企业或个人的品牌形象,传递清晰…...

【Python】Uvicorn:Python 异步 ASGI 服务器详解
Uvicorn 是一个为 Python 设计的 ASGI(异步服务器网关接口)Web 服务器。它填补了 Python 在异步框架中缺乏一个最小化低层次服务器/应用接口的空白。Uvicorn 支持 HTTP/1.1 和 WebSockets,是构建现代异步Web应用的强大工具。 ⭕️宇宙起点 &a…...

类型转换【C++提升】(隐式转换、显式转换、自定义转换、转换构造函数、转换运算符重载......你想知道的全都有)
更多精彩内容..... 🎉❤️播主の主页✨😘 Stark、-CSDN博客 本文所在专栏: C系列语法知识_Stark、的博客-CSDN博客 座右铭:梦想是一盏明灯,照亮我们前行的路,无论风雨多大,我们都要坚持不懈。 一…...

微信小程序hbuilderx+uniapp+Android 新农村综合风貌旅游展示平台
目录 项目介绍支持以下技术栈:具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是:数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 小程序端…...

【AI大模型】使用Embedding API
一、使用OpenAI API 目前GPT embedding mode有三种,性能如下所示: 模型每美元页数MTEB得分MIRACL得分text-embedding-3-large9,61554.964.6text-embedding-3-small62,50062.344.0text-embedding-ada-00212,50061.031.4 MTEB得分为embedding model分类…...

面试速通宝典——11
188. 总结static的应用和作用 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其他函…...

python:reportlab 将多个图片合并成一个PDF文件
承上一篇:java:pdfbox 3.0 去除扫描版PDF中文本水印 # 导出扫描版PDF文件中每页的图片文件 java -jar pdfbox-app-3.0.3.jar export:images -prefixtest -i your_book.pdf 导出 Writing image: test-1.jpg Writing image: test-2.jpg Writing image: t…...

决策树:机器学习中的强大工具
什么是决策树? 决策树是一种通过树状结构进行决策的模型。它的每个节点代表一个特征(或属性),每个分支代表特征的可能值,而每个叶子节点则代表最终的决策结果或分类。想象一下,在选择晚餐时,你…...

平面电磁波(解麦克斯韦方程)电场相位是复数的积分常数,电场矢量每个分量都有一个相位。磁场相位和电场一样,这是因为无损介质中实数的波阻抗
注意无源代表你立方程那个点xyzt处没有源,电场磁场也是这个点的。 j电流面密度,电流除以单位面积,ρ电荷体密度,电荷除以单位体积。 j方程组有16个未知数,每个矢量有三个xyz分量,即三个未知数,…...

复习HTML(进阶)
前言 上一篇的最后我介绍了在表单中,上传文件需要使用到 method属性 和enctype属性。本篇博客主要是详细的介绍这些知识 <form action"http://localhost:8080/test" method"post" enctype"multipart/form-data"> method属性…...

Qt 每日面试题 -7
61、如何安全的在另外一个线程中调用QObject对象的接口 QObject被设计成在一个单线程中创建与使用,因此,在一个线程中创建一个对象,而在另外的线程中调用它的函数,这样的行为不能保证工作良好。使用信号槽的队列连接或者QT的反射…...

《计算机原理与系统结构》学习系列——计算机的算数运算(下)
系列文章目录 目录 浮点数的表示和运算浮点数的表示浮点数的规格化浮点数标准IEEE754浮点数表示范围浮点数的转换浮点数的运算浮点数加法浮点数加法的硬件实现 精度浮点乘法浮点运算硬件 MIPS中的浮点指令 浮点数的表示和运算 浮点数的表示 表达非整型的数 可以表达很小和很大…...

二叉树进阶学习——从前序和中序遍历序列构造二叉树
1.题目解析 题目来源:105.从前序与中序遍历序列构造二叉树——力扣 测试用例 2.算法原理 首先要了解一个概念 前序遍历:按照 根节点->左子树->右子树的顺序遍历二叉树 中序遍历:按照 左子树->根节点->右子树的顺序遍历二叉树 题目…...

【数据分享】2000—2023年我国省市县三级逐年植被覆盖度(FVC)数据(Shp/Excel格式)
之前我们分享过2000—2023年逐月植被覆盖度(FVC)栅格数据(可查看之前的文章获悉详情)和Excel和Shp格式的省市县三级逐月FVC数据(可查看之前的文章获悉详情),原始的逐月栅格数据来源于高吉喜学者…...

【Python】Streamlit:为数据科学与机器学习打造的简易应用框架
Streamlit 是一个开源的 Python 库,专为数据科学家和机器学习开发者设计,旨在快速构建数据应用。通过简单的 Python 脚本,开发者无需掌握前端技术,即可将数据分析和模型结果转化为直观、交互式的 Web 应用。其简洁的 API 设计使得…...

OpenJudge | 置换选择排序
总时间限制: 1000ms 内存限制: 65536kB 描述 给定初始整数顺串,以及大小固定并且初始元素已知的二叉最小堆(为完全二叉树或类似完全二叉树,且父元素键值总小于等于任何一个子结点的键值),要求利用堆实现置换选择排序&a…...