nodejs框架 express koa介绍以及从零搭建 koa 模板
express
下载
npm install express
搭建服务
const express = require("express");const app = express();app.get("/home", (req, res) => {res.send("home");
});app.listen(3000, () => {console.log("http://127.0.0.1:3000");
});
restful api
| 操作 | 请求类型 | url | 返回 |
|---|---|---|---|
| 获取所有 | GET | /users | |
| 获取单个 | GET | /users/1 | |
| 新增 | POST | /users | |
| 修改部分 | PATCH | /users/1 | |
| 修改全部 | PUT | /users/1 | |
| 删除 | DELETE | /users/1 |
路由
一个路由由 请求方法 路径 和 回调函数组成
app.get("/users", (req, res) => {res.send("get users");
});app.post("/users", (req, res) => {res.send("post users");
});app.delete("/users", (req, res) => {res.send("delete users");
});app.put("/users", (req, res) => {res.send("put users");
});app.patch("/users", (req, res) => {res.send("patch users");
});
匹配 404 路由
app.all("*", (req, res) => {res.send("404 not found");
});
获取请求报文参数
// /users?a=1&b=2
app.get("/users", (req, res) => {// /usersconsole.log(req.path);// { a: '1', b: '2' }console.log(req.query);// 获取请求头信息console.log(req.get("User-Agent"));
});
获取动态路由参数
app.get("/users/:id", (req, res) => {console.log("id", req.params.id);res.send("get users");
});
获取 post 请求体参数
下载
npm i body-parser
// 引包
const bodyParser = require("body-parser");// 配置
// 解析 querystring 格式请求体
app.use(bodyParser.urlencoded({ extecded: false }));
// 解析 json 格式请求体
app.use(bodyParser.json());app.post("/users", (req, res) => {console.log(req.body);
});
响应
app.get("/users/:id", (req, res) => {// 设置状态码res.status(200);// 设置响应头res.set("abc", "abc");// 返回字符串res.send("get users");// 返回 json 数据res.json({data: "123",});// 重定向res.redirect("http://www.baidu.com");// 下载响应res.download("./test.txt");// 响应文件内容res.sendFile("./test.html");
});
中间件 Middleware
中间件本质是一个回调函数,可以像路由回调一样访问请求对象request 响应对象 response
中间件的作用是:使用函数封装公共操作,简化代码
全局中间件
// 声明中间件
function customMiddleware(req, res, next) {console.log("全局中间件使用了");// 必须调用next();
}// 使用
app.use(customMiddleware);
路由中间件
// 声明中间件
function customMiddleware(req, res, next) {console.log("路由中间件使用了");next();
}// 使用
app.get("/users", customMiddleware, (req, res) => {res.send("get user");
});// 多个中间件使用
app.get("/users", customMiddleware, customMiddleware2, (req, res) => {res.send("get user");
});
静态资源
app.use(express.static(path.join(__dirname, '../public')));// public 文件夹路径可省略不写如下
http://127.0.0.1:3000/mn.png
防盗链 referer
function customMiddleware(req, res, next) {const referer = req.get("referer");next();
}
文件上传 formidable
下载
npm install formidable@v2
使用
const formidable = require("formidable");router.post("/upload", function (req, res, next) {const form = formidable({multiples: true,// 设置上传文件的保存目录uploadDir: path.join(__dirname, "../public/images"),// 保存文件后缀keepExtensions: true,});form.parse(req, (err, fields, files) => {if (err) {next(err);return;}res.json({ fields, files });});
});
koa
下载
npm install koa
使用
const Koa = require("koa");const app = new Koa();app.listen(3000, () => {console.log(`http://127.0.0.1:3000`);
});
获取 get 请求体参数
ctx.request.query
获取动态路由参数
ctx.params?.id
@koa/router 路由
下载
npm install @koa/router
使用
const Router = require("@koa/router");const router = new Router();// 设置路由前缀
// const router = new Router({ prefix: "/users" });router.get("/", (ctx) => {ctx.body = {code: 0,};
});app.use(router.routes());
koa-body
获取 post 请求体参数
下载
npm install koa-body
使用
const { koaBody } = require("koa-body");app.use(koaBody());
获取 post 请求体参数
ctx.request.body
koa-static
配置静态资源
下载
npm install koa-static
使用
const path = require("node:path");
const static = require("koa-static");app.use(static(path.join(__dirname, "../public")));
// http://127.0.0.1:3000/images/test.jpg
npm install koa-views ejs
引入模板文件
下载
npm install koa-views ejs
使用
const views = require("koa-views");
// 此时文件后缀为 .ejs
// app.use(views(path.join(__dirname, "../views"), { extension: "ejs" }));
// 把文件后缀替换为 .html
app.use(views(path.join(__dirname, "../views"), { map: { html: "ejs" } }));router.get("/", async (ctx) => {let title = "你好ejs";let list = ["哈哈", "嘻嘻", "看看", "问问"];let content = "<h2>这是一个h2</h2>";let num = 10;await ctx.render("index", {title,list,content,num,});
});
模板
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><h1>普通模版</h1><h1>ejs循环输出模版</h1><ul><%for(var i=0;i<list.length;i++){%><li><%= list[i] %></li><%}%></ul><h2>原文输出标签</h2><%- content %><h2>条件判断</h2><% if(num> 20){ %>大于20<% }else{ %>小于20<% }%>
</body></html>
formidable 文件上传
下载
npm install formidable@v2
使用
const path = require("node:path");
const formidable = require("formidable");router.post("/", async (ctx, next) => {const form = formidable({multiples: true,// 设置上传文件的保存目录uploadDir: path.join(__dirname, "../public/uploads"),// 保存文件后缀keepExtensions: true,// 修改文件名 必须返回一个字符串即:新的存储文件名称filename: (name, ext, part, form) => {return `ttttt${ext}`;},});await new Promise((resolve, reject) => {form.parse(ctx.req, (err, fields, files) => {if (err) return reject(err);// files.file file就是前端上传的字段名称ctx.body = { fields, files: files.file };resolve();});});return await next();
});
async-validator 数据校验
下载
npm i async-validator
两种模块化使用方式
es6
import Schema from "async-validator";const descriptor = {age: {type: "number",required: true,message: "年龄必填",},
};const validator = new Schema(descriptor);
const values = await validator.validate({ age });
commonjs
const Schema = require("async-validator");const descriptor = {age: {type: "number",required: true,message: "年龄必填",},
};const validator = new Schema.default(descriptor);
const values = await validator.validate({ age });
其他常用校验
const Schema = require("async-validator");async create(ctx) {try{let { name, age, sex } = ctx.request.body;// 参数检验const descriptor = {name: [{// 类型type: "string",// 必填required: true,// 长度(姓名三个字)// len: 3,// 范围(姓名3-5个字)min: 3,max: 5,// 提示信息message: "姓名3-5个字",},{// 自定义校验函数validator: (rule, value) => value.includes("xr"), message: "姓名必须包含xr" },],age: {type: "number",required: true,// 正则pattern: /^[0-9]+$/,// 验证前执行的函数:去除空格transform(value) {return value.trim();},message: "年龄必填",},sex: {type: "enum",enum: [1, 2],required: true,message: "性别错误",},};const validator = new Schema.default(descriptor);const values = await validator.validate({ name, age, sex });}catch(error){const msg = error?.errors[0]?.message;}
}
错误处理 koa-json-error
下载
npm install --save koa-json-error
使用
const error = require("koa-json-error");const app = new Koa();
app.use(error());
cross-env 设置环境变量
下载
npm install --save-dev cross-env
配置变量
package.json
// cross-env NODE_ENV=dev NODE_TEST=true
{"scripts": {"test": "echo \"Error: no test specified\" && exit 1","dev": "cross-env NODE_ENV=dev NODE_TEST=true nodemon ./src/main.js "},
}
获取值
// dev true string
console.log(process.env.NODE_ENV, process.env.NODE_TEST, typeof process.env.NODE_TEST);
dotenv
从 .env 为 nodejs 项目加载环境变量。
下载
npm install dotenv --save
配置使用
在项目的根目录中创建一个 .env 文件
.env
NODE_PORT = 3000;
const path = require("path");
// 添加到 process.env 中,默认获取 .env 文件
require("dotenv").config();// 获取 .env.dev 文件
require("dotenv").config({ path: path.resolve(process.cwd(), ".env.dev") });// 3000
console.log(process.env.NODE_PORT);
jsonwebtoken
下载
npm install jsonwebtoken
生成 token
const jwt = require("jsonwebtoken");
const token = jwt.sign(payload, JWTSECRET, { expiresIn: 60 * 60 * 24 });
验证 token
jwt.verify(token, JWTSECRET);
报错 Expected “payload” to be a plain object.(翻译结果为:“payload”应为纯对象。)
返回的不是纯对象 == res._doc
const res = await UserModel.create(body);
const token = jwt.sign(res._doc, JWTSECRET, { expiresIn: 60 * 60 * 24 });
bcryptjs
下载
npm install bcryptjs
使用
/*** 加密* @param {*} val* @returns*/
const crpytPassword = (val) => {const salt = bcrypt.genSaltSync(10);const hash = bcrypt.hashSync(val, salt);return hash;
};/*** 解密验证* @param {*} val 原始值* @param {*} hash 加密后的值* @returns*/
const checkPassword = (val, hash) => {return bcrypt.compareSync(val, hash);
};
pm2 负载均衡
下载
npm install pm2@latest -g
查看版本
pm2 - v;
启动
pm2 start app.js// --watch 监听
pm2 start app.js --watch// --name 别名
pm2 start app.js --name test
重载(不关闭)和重启(瞬间关闭开启)
pm2 reload app.js
pm2 reload allpm2 restart app.js
pm2 restart all
从 pm2 中关闭
pm2 stop id值// 例
pm2 stop 0
pm2 stop all
从 pm2 中移除
pm2 delete 0
pm2 delete all
查看 pm2 所有项目列表
pm2 list
查看详情
pm2 show name的值// 例
pm2 show app
实时监控查看资源
pm2 monit
查看日志
pm2 logspm2 logs app
mode
-
fork
只启动一个进程单实例,用于多语言混编 python php -
cluster
多实例多进程,只适用 node 一种语言,不需要额外端口配置
生成配置文件
pm2 init simple// 运行
pm2 start .\ecosystem.config.js
相关文章:
nodejs框架 express koa介绍以及从零搭建 koa 模板
express 下载 npm install express搭建服务 const express require("express");const app express();app.get("/home", (req, res) > {res.send("home"); });app.listen(3000, () > {console.log("http://127.0.0.1:3000")…...
84 | Python可视化篇 —— Pyecharts数据可视化
文章目录 1. 简介安装和环境设置2. 基本图表类型折线图(Line Chart)散点图(Scatter Plot)柱状图(Bar Chart)饼图(Pie Chart)地理地图(Geo Map)3. 数据处理和图表配置4. 高级图表类型5. 自定义选项和交互性6. 数据可视化和动态图7. 组合图表和多子图1. 简介 Pyechart…...
【Nginx】Nginx负载均衡
负载均衡:通过反向代理来实现 Nginx的七层代理和四层代理: 七层是最常用的反向代理方式,只能配置在nginx配置文件的http模块当中 ;配置的方法名称为:upstream模块,不能写在server中也不能写在location中&a…...
vue3报错
这是因为eslint对代码的要求严格导致的,可以在package.json里面删掉"eslint:recommended",然后重启就可以正常运行了...
每日一学——IP地址和子网掩码
IP地址和子网掩码是网络中非常重要的概念。IP地址是用于标识和寻址网络中设备(如计算机、手机等)的唯一标识符。而子网掩码则用于划分网络中的子网。 IP地址是一个由32位二进制数组成的地址,通常以点分十进制的形式表示,如192.16…...
【redis 3.2 集群】
目录 一、Redis主从复制 1.概念 2.作用 2.1 数据冗余 2.2 故障恢复 2.3 负载均衡 2.4 高可用 3.缺点 4.流程 4.1 第一步 4.2 第二步 4.3 第三步 4.4 第四步 5.搭建 5.1 主 5.2 从 6.验证 二、Reids哨兵模式 1.概念 2.作用 2.1 监控 2.2 自动故障转移 2.…...
JS 解决鼠标悬浮显示弹窗 迅速离开时弹窗显示到其他位置的延迟问题
解决该问题的思路就是,判断当前鼠标的位置是否在某个div上,如果在这个div上则取消显示悬浮弹窗消息。 首先监听鼠标的移动事件 鼠标移动时判断是否在div里面进行移动了 clientX表示鼠标X的位置 client Y表示鼠标Y的位置 拿到要判断的div元素 获取off…...
树莓派命令行运行调用音频文件的函数,不报错,没有声音解决办法
树莓派接上音频首先需要切换音频不是HDMI,然后可以双击运行wav文件可以播放,但是: 命令行直接运行wav文件报错: Playing WAVE twzc.wav : Signed 16 bit Little Endian, Rate 16000 Hz, Mono命令行运行main方法也是无法播放&am…...
解决无法引入 mysql-connector-j 的问题
开发环境 Windows 10Oracle JDK 1.8Maven 3.8.8IntelliJ IDEA 2022.2.2 问题 在使用 Spring initializr 创建 Spring Boot 项目时,无法引入 mysql-connector-j 这个依赖,报错信息: com.mysql:mysql-connector-j:jar:unknown was not foun…...
解释器模式(Interpreter)
解释器模式是一种行为设计模式,可以解释语言的语法或表达式。给定一个语言,定义它的文法的一种表示,然后定义一个解释器,使用该文法来解释语言中的句子。解释器模式提供了评估语言的语法或表达式的方式。 Interpreter is a behav…...
python读入和读出图像
python提供了PIL库和opencv库对图像进行读取并保存。 图像读入读出 给定一张RGB的彩色图像,PIL库将其读入: import cv2 from PIL import Image # 读入图像 image2 Image.open(cub1.jpg) print(type(image2)) image2_array np.array(image2) print(image2_array…...
每日一题——最长公共前缀
题目 给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。 数据范围:0≤n≤5000, 0≤len(strsi)≤5000 进阶:空间复杂度 O(1),…...
iOS开发-WebRTC本地直播高分辨率不显示画面问题
iOS开发-WebRTC本地直播高分辨率不显示画面问题 在之前使用WebRTC结合ossrs进行推流时候,ossrs的播放端无法看到高分辨率画面问题。根据这个问题,找到了解决方案。 一、WebRTC是什么 WebRTC是什么呢? WebRTC (Web Real-Time Communicatio…...
python项目virtualenv环境部署正式项目和后台运行实践
pycharm创建virtualenv环境的项目: 在本地虚拟环境项目路径下生成依赖包记录文件,然后上传到linux 服务器项目路径下: 注意注意:要在虚拟环境中生成,才能将所有的项目依赖包构建在 requirements.txt文件中。 pip3 fre…...
平替 Docker - 玩转容器新利器 Podman Desktop (视频)
《OpenShift 4.x HOL教程汇总》 在 podman-desktop 1.2.1 podman 4.4 环境中验证。 文章目录 什么是 podman 和 podman-desktop安装 podman 和 podman-desktop 基本环境Image、Container 和 Pod 的基本操作拉取 Image运行 Container 将 Pod 部署到 Kubernetes安装 Kind 扩展插…...
nodejs+vue+elementui招聘求职网站系统的设计与实现-173lo
(1)管理员的功能是最高的,可以对系统所在功能进行查看,修改和删除,包括企业和用户功能。管理员用例如下: 图3-1管理员用例图 (2)企业关键功能包含个人中心、岗位类型管理、招聘信息…...
静态链接(7/13)
在一个软件项目中,为了完成特定功能,除了自定义函数,还可以使用别人已经封装好的函数库,如 C 函数库。库函数的使用避免了重复“造笼子”的重复工作,提高了代码复用率,大大减轻了软件开发的工作量。 库分为…...
jvs-rules API数据源配置说明(含配置APIdemo视频)
在JVS中,多数据源支持多种形态的数据接入,其中API是企业生产过程中常见的数据形态。使用数据源的集成配置,以统一的方式管理和集成多个API的数据。这些平台通常提供各种数据转换和处理功能,使得从不同数据源获取和处理数据变得更加…...
爬虫来介绍ChromeF12 谷歌开发者工具 -Network
了解网页基础(HTML、CSS、JavaScript) 了解HTTP基本原理 了解JSON格式 了解Ajax请求 了解爬虫基本原理 (一)、Chrome开发者工具面板概述 Elements 查找网页源代码HTML中的任一元素,手动修改任一元素的属性和样式且能实时在浏览器里面得到反馈。 比如我们在Event Listener…...
[足式机器人]Part4 机械设计 Ch00/01 绪论+机器结构组成与连接 ——【课程笔记】
本文仅供学习使用 本文参考: 《机械设计》 王德伦 马雅丽课件与日常作业可登录网址 http://edu.bell-lab.com/manage/#/login,选择观摩登录,查看2023机械设计2。 机械设计-Ch00Ch01——绪论机器结构组成与连接 Ch00-绪论0.1 何为机械设计——…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
