当前位置: 首页 > news >正文

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负载均衡

负载均衡&#xff1a;通过反向代理来实现 Nginx的七层代理和四层代理&#xff1a; 七层是最常用的反向代理方式&#xff0c;只能配置在nginx配置文件的http模块当中 &#xff1b;配置的方法名称为&#xff1a;upstream模块&#xff0c;不能写在server中也不能写在location中&a…...

vue3报错

这是因为eslint对代码的要求严格导致的&#xff0c;可以在package.json里面删掉"eslint:recommended"&#xff0c;然后重启就可以正常运行了...

每日一学——IP地址和子网掩码

IP地址和子网掩码是网络中非常重要的概念。IP地址是用于标识和寻址网络中设备&#xff08;如计算机、手机等&#xff09;的唯一标识符。而子网掩码则用于划分网络中的子网。 IP地址是一个由32位二进制数组成的地址&#xff0c;通常以点分十进制的形式表示&#xff0c;如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 解决鼠标悬浮显示弹窗 迅速离开时弹窗显示到其他位置的延迟问题

解决该问题的思路就是&#xff0c;判断当前鼠标的位置是否在某个div上&#xff0c;如果在这个div上则取消显示悬浮弹窗消息。 首先监听鼠标的移动事件 鼠标移动时判断是否在div里面进行移动了 clientX表示鼠标X的位置 client Y表示鼠标Y的位置 拿到要判断的div元素 获取off…...

树莓派命令行运行调用音频文件的函数,不报错,没有声音解决办法

树莓派接上音频首先需要切换音频不是HDMI&#xff0c;然后可以双击运行wav文件可以播放&#xff0c;但是&#xff1a; 命令行直接运行wav文件报错&#xff1a; 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 项目时&#xff0c;无法引入 mysql-connector-j 这个依赖&#xff0c;报错信息&#xff1a; com.mysql:mysql-connector-j:jar:unknown was not foun…...

解释器模式(Interpreter)

解释器模式是一种行为设计模式&#xff0c;可以解释语言的语法或表达式。给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;然后定义一个解释器&#xff0c;使用该文法来解释语言中的句子。解释器模式提供了评估语言的语法或表达式的方式。 Interpreter is a behav…...

python读入和读出图像

python提供了PIL库和opencv库对图像进行读取并保存。 图像读入读出 给定一张RGB的彩色图像&#xff0c;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 &#xff0c;其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀&#xff0c;返回这个公共前缀。 数据范围&#xff1a;0≤n≤5000&#xff0c; 0≤len(strsi)≤5000 进阶&#xff1a;空间复杂度 O(1)&#xff0c;…...

iOS开发-WebRTC本地直播高分辨率不显示画面问题

iOS开发-WebRTC本地直播高分辨率不显示画面问题 在之前使用WebRTC结合ossrs进行推流时候&#xff0c;ossrs的播放端无法看到高分辨率画面问题。根据这个问题&#xff0c;找到了解决方案。 一、WebRTC是什么 WebRTC是什么呢&#xff1f; WebRTC (Web Real-Time Communicatio…...

python项目virtualenv环境部署正式项目和后台运行实践

pycharm创建virtualenv环境的项目&#xff1a; 在本地虚拟环境项目路径下生成依赖包记录文件&#xff0c;然后上传到linux 服务器项目路径下&#xff1a; 注意注意&#xff1a;要在虚拟环境中生成&#xff0c;才能将所有的项目依赖包构建在 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

&#xff08;1&#xff09;管理员的功能是最高的&#xff0c;可以对系统所在功能进行查看&#xff0c;修改和删除&#xff0c;包括企业和用户功能。管理员用例如下&#xff1a; 图3-1管理员用例图 &#xff08;2&#xff09;企业关键功能包含个人中心、岗位类型管理、招聘信息…...

静态链接(7/13)

在一个软件项目中&#xff0c;为了完成特定功能&#xff0c;除了自定义函数&#xff0c;还可以使用别人已经封装好的函数库&#xff0c;如 C 函数库。库函数的使用避免了重复“造笼子”的重复工作&#xff0c;提高了代码复用率&#xff0c;大大减轻了软件开发的工作量。 库分为…...

jvs-rules API数据源配置说明(含配置APIdemo视频)

在JVS中&#xff0c;多数据源支持多种形态的数据接入&#xff0c;其中API是企业生产过程中常见的数据形态。使用数据源的集成配置&#xff0c;以统一的方式管理和集成多个API的数据。这些平台通常提供各种数据转换和处理功能&#xff0c;使得从不同数据源获取和处理数据变得更加…...

爬虫来介绍ChromeF12 谷歌开发者工具 -Network

了解网页基础(HTML、CSS、JavaScript) 了解HTTP基本原理 了解JSON格式 了解Ajax请求 了解爬虫基本原理 (一)、Chrome开发者工具面板概述 Elements 查找网页源代码HTML中的任一元素,手动修改任一元素的属性和样式且能实时在浏览器里面得到反馈。 比如我们在Event Listener…...

[足式机器人]Part4 机械设计 Ch00/01 绪论+机器结构组成与连接 ——【课程笔记】

本文仅供学习使用 本文参考&#xff1a; 《机械设计》 王德伦 马雅丽课件与日常作业可登录网址 http://edu.bell-lab.com/manage/#/login&#xff0c;选择观摩登录&#xff0c;查看2023机械设计2。 机械设计-Ch00Ch01——绪论机器结构组成与连接 Ch00-绪论0.1 何为机械设计——…...

高敏感应用如何保护自身不被逆向?iOS 安全加固策略与工具组合实战(含 Ipa Guard 等)

如果你正在开发一款涉及支付、隐私数据或企业内部使用的 App&#xff0c;那么你可能比多数开发者更早意识到一件事——App 一旦被破解&#xff0c;损失的不只是代码&#xff0c;还有信任与业务逻辑。 在我们为金融类工具、HR 系统 App、数据同步组件等高敏感项目提供支持的过程…...

GC1809:高性能音频接收与转换芯片

GC1809 是一款高性能音频接收与转换芯片&#xff0c;适用于多种音频设备&#xff0c;如 A/V 接收器、多媒体音响设备、机顶盒等。本文将简要介绍该芯片的主要特性、性能参数及应用。 主要特性 多协议兼容&#xff1a;兼容 IEC60958、S/PDIF、EIAJ CP1201 和 AES3 协议。 多种…...

SpringBoot(八) --- SpringBoot原理

目录 一、配置优先级 二、Bean的管理 1. Bean的作用域 2. 第三方Bean 三、SpringBoot原理 1. 起步依赖 2. 自动配置 3. 自动配置原理分析 3.1 源码解析 3.2 Conditional 一、配置优先级 SpringBoot项目当中支持三类配置文件&#xff1a; application.properties a…...

电子电器架构 --- OTA测试用例分析(上)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

定时任务的 cron 表达式

定时任务的 cron 表达式 一、什么时 cron 表达式 Cron表达式是一种广泛应用于Linux系统的时间表示格式&#xff0c;常用于定时任务的调度。Cron表达式可以通过指定不同的时间参数&#xff0c;描述一个在 未来某个时间点执行的任务。 二、Cron表达式语法 秒 分 时 日 月 周几…...

Python6.5打卡(day37)

DAY 37 早停策略和模型权重的保存 知识点回顾&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 作业&#xff1a;对信贷数据集训练后保存权重&#xf…...

C#学习第27天:时间和日期的处理

时间和日期的核心概念 1. UTC 和 本地时间 UTC&#xff08;Coordinated Universal Time&#xff09;&#xff1a; 是一种不受时区影响的世界标准时间。在网络通信和全球协作中&#xff0c;用于统一时间度量 本地时间&#xff08;Local Time&#xff09;&#xff1a; 是根据所…...

【快速预览经典深度学习模型:CNN、RNN、LSTM、Transformer、ViT全解析!】

&#x1f680;快速预览经典深度学习模型&#xff1a;CNN、RNN、LSTM、Transformer、ViT全解析&#xff01; &#x1f4cc;你是否还在被深度学习模型名词搞混&#xff1f;本文带你用最短时间掌握五大经典模型的核心概念和应用场景&#xff0c;助你打通NLP与CV的任督二脉&#xf…...

ubuntu开机自动挂载windows下的硬盘

我是ubuntu和windows的双系统开发&#xff0c;在ubuntu下如果想要访问windows的硬盘&#xff0c;需要手动点击硬盘进行挂载&#xff0c;这个硬盘我每次编译完都会使用&#xff0c;所以用下面的步骤简化操作&#xff0c;让系统每次开机后自动挂载。 第一步. 确定硬盘的设备标识…...

Ubuntu设置之初始化

安装SSH服务 # 安装 OpenSSH Server sudo apt update sudo apt install -y openssh-server# 检查 SSH 服务状态 sudo systemctl status ssh # Active: active (running) since Sat 2025-05-31 17:13:07 CST; 6s ago# 重启服务 sudo systemctl restart ssh自定义分辨率 新…...