Node.Js+Knex+MySQL增删改查的简单示例(Typescript)
数据库:
CREATE DATABASE `MyDB`;
CREATE TABLE `t_users` (`user_id` int(11) NOT NULL,`user_name` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
项目结构:

package.json如下,拷贝并替换你们本地的package.json后运行 npm install 命令安装所需要的依赖。项目使用了nodemon+ts-node方便development
{"name": "tsdemo","version": "1.0.0","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","start": "nodemon"},"keywords": [],"author": "","license": "ISC","description": "","devDependencies": {"@types/node": "^22.9.0","nodemon": "^3.1.7","ts-node": "^10.9.2","typescript": "^5.6.3"},"dependencies": {"@types/express": "^5.0.0","express": "^4.21.1","knex": "^3.1.0","mysql": "^2.18.1"}
}
nodemon.json:
{"watch": ["src/**/*.js", "src/**/*.ts", "util/**/*.ts"], "ext": "js,ts,json", "ignore": ["node_modules", "dist"], "exec": "ts-node src/index.ts", "delay": "2500"
}
tsconfig.json:
{"compilerOptions": {"target": "es2016", "module": "commonjs", "outDir": "./dist", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true },"include": ["src/**/*"
, "util/**/*" ],"exclude": ["node_modules","**/*.spec.ts"]
}
代码部分,VS Code推荐使用Fitten Code插件,目前免费的AI编程工具。可以检查错误,智能补全,代码解释等等,极大提高效率。
db.ts:
import { rejects } from "assert"
import { knex } from "knex"
import { resolve } from "path"const db = knex({client: "mysql",connection: {host: "localhost",user: "root",password: "root",database: "MyDB"}
})type UserRow = {user_id:number,user_name:string,
}
//增
export async function addUser(user_name:string) : Promise<string | null> {let user_id:number = 0await getMaxUserId().then((max_id) => {console.log("max_id: ", max_id)return new Promise((resolve, reject) => {if(max_id){console.log("current max_id: ", max_id)user_id = max_id === null? 0 : max_id + 1console.log("new user_id: ", user_id)try{db("t_users").insert({user_id, user_name})console.log("add success")resolve("add success")}catch(error){console.error(error)reject("add failed")}}})})return null
}
//删
export async function deleteUser(user_id:number) : Promise<string | null> {const user = await getUserById(user_id);return new Promise((resolve, reject) => {if (user) {try {db("t_users").where("user_id", user_id).del().then(() => { console.error("delete success");resolve("delete success");}).catch(error => {console.error("delete failed", error);reject("delete failed");});} catch (error) {console.error(error);reject("delete failed");}} else {console.error("user not found");resolve("user not found"); }});
}
//改
export async function updateUser(user_id:number, user_name:string) : Promise<string | null> {const user = await getUserById(user_id);return new Promise((resolve, reject) => {if (user) {try {db("t_users").where("user_id", user_id).update({user_name}).then(() => { console.error("update success");resolve("update success");}).catch(error => {console.error("update failed", error);reject("update failed");});} catch (error) {console.error(error);reject("update failed");}} else {console.error("user not found");resolve("user not found"); }});
}
//查
export async function getUsers() : Promise<UserRow[] | null> {try {const users = await db("t_users").select("*")console.log(users)return users} catch (error) {console.error(error)return null}
}export async function getMaxUserId() : Promise<number | null> { try {const max_id = await db("t_users").max("user_id as max");if(max_id && max_id.length > 0) {return max_id[0].max;} else {return null; }} catch (error) {console.error(error);return null; }
}export async function getUserById(user_id:number) : Promise<UserRow | null> { try{const user = await db("t_users").select("*").where("user_id", user_id).first()console.log(user)return user}catch(error){ console.error(error)return null}
}export default db
index.ts:
import * as userdb from '../util/db';
import express, {Express, Request, Response} from 'express'
import bodyParser from 'body-parser';const app : Express = express();
app.use(bodyParser.json());
//增
app.post('/adduser', (req : Request, res : Response) => {const user_name = req.body.user_name;userdb.addUser(user_name).then((resolve) => { res.send(resolve);}).catch((error) => { res.send(error) });
});
//查
app.get('/getusers', (req : Request, res : Response) => {userdb.getUsers().then((user) => { if(user != null){res.send(JSON.stringify(user));}else{res.send('no user found');}}).catch((error) => { res.send(error) });
});
//删
app.post('/deleteuser', (req : Request, res : Response) => {const user_id = req.body.user_id;userdb.deleteUser(user_id).then((resolve) => { res.send(resolve);}).catch((error) => { res.send(error) });
});
//改
app.post('/updateuser', (req : Request, res : Response) => {const user_id = req.body.user_id;const user_name = req.body.user_name;userdb.updateUser(user_id, user_name).then((resolve) => { res.send(resolve);}).catch((error) => { res.send(error) });
});app.listen(3000, () => {const currentDate = new Date(); const formattedDate = currentDate.toLocaleString();console.log(`server started on port 3000 at ${formattedDate}`);
});
npm start 运行

因为使用了ts-node,所以如果需要生成的js文件,运行tsc命令即可


推荐使用VS Code的插件REST Client进行测试。
测试文件 .http 示例如下:
###
GET http://localhost:3000/getusers###
POST http://localhost:3000/adduser
Content-Type: application/json{"user_name": "admin"
}###
POST http://localhost:3000/deleteuser
Content-Type: application/json{"user_id": 1
}###
POST http://localhost:3000/updateuser
Content-Type: application/json{"user_id": 1,"user_name": "admin111"
}
部分测试结果:

相关文章:
Node.Js+Knex+MySQL增删改查的简单示例(Typescript)
数据库: CREATE DATABASE MyDB; CREATE TABLE t_users (user_id int(11) NOT NULL,user_name varchar(10) NOT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8; 项目结构: package.json如下,拷贝并替换你们本地的package.json后运行 npm install 命令安装所需要的依赖。…...
机器学习的概览
笔记内容侵权联系删除 机器学习算法 机器学习(包括深度学习分支)是研究“学习算法”的一门学问。所谓“学习”是指:对于某类任务T和性能度量P,一个计算机程序在T上以P衡量的性能随着经验E而自我完善,那么我们称这个计算机程序在从经验E学习。 机器学习…...
方法论-WPS模型(高效沟通和决策分析的框架)
WPS模型(What, Problem, Solution)是一种高效沟通和决策分析的框架,旨在帮助沟通者清晰、简洁地表达问题和解决方案,特别适用于在复杂或多变的环境中进行清晰的交流。WPS模型的核心是通过以下三个步骤来组织沟通内容: …...
OpenTelemetry 赋能DevOps流程的可观测性革命
作者:天颇 引言 在当今快节奏的软件开发和运维环境中,DevOps 已经成为主流,它通过整合开发和运维流程,推动着软件的快速迭代和持续交付。然而,随着微服务、容器化和云计算等技术的普及,系统复杂性急剧增加…...
子集选择——基于R语言实现(最优子集选择法、逐步回归法、Lasso回归法、交叉验证法)
( a )使用 rnorm() 函数生成预测变量X(n=100)与噪声向量 ϵ \epsilon ϵ(n=100) set.seed(1) x<-rnorm(100)#预测变量X eps<-rnorm(100)#噪声向量$\epsilon$( b ) 生成响应变量Y(n=100),...
Ubuntu24.04挂载磁盘
一、引言 由于几块磁盘每次开机时的编号都不一样,造成了很多麻烦,所有重新挂载磁盘试一试。 参考链接: ubuntu挂载磁盘或U盘Ubuntu添加新硬盘,挂载到根目录下的某个文件中 二、挂载磁盘 1. 查看盘名 sudo fdisk -l sda 代表第…...
使用机器学习优化数据库查询性能
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用机器学习优化数据库查询性能 文章目录 使用机器学习优化数据库查询性能引言数据库查询性能概述查询优化的重要性 机器学习在…...
英伟达基于Mistral 7B开发新一代Embedding模型——NV-Embed-v2
我们介绍的 NV-Embed-v2 是一种通用嵌入模型,它在大规模文本嵌入基准(MTEB 基准)(截至 2024 年 8 月 30 日)的 56 项文本嵌入任务中以 72.31 的高分排名第一。此外,它还在检索子类别中排名第一(…...
HTML面试题(2)
HTML5相比HTML有哪些更新? 语义化更强的HTML元素:引入artitcle、section、nav、header、footer等元素,帮助创建结构更清晰、语义更明确的网页,有利于SEO和内容的可访问性表单控件增强:新增多种表单输入类型࿰…...
微服务day07
MQ高级 发送者可靠性,MQ的可靠性,消费者可靠性。 发送者可靠性 发送者重连 连接重试的配置文件: spring:rabbitmq:connection-timeout: 1s # 设置MQ的连接超时时间template:retry:enabled: true # 开启超时重试机制initial-interval: 10…...
芯原科技嵌入式面试题及参考答案
Linux 相关驱动怎么写? 在 Linux 中编写驱动主要有以下步骤。 首先,需要了解设备的硬件特性。这包括设备的工作原理、寄存器地址和功能、中断号等信息。例如,对于一个简单的 GPIO 设备,要知道其数据寄存器、方向寄存器的位置以及读写操作的规则。 然后是模块的初始化部分。…...
二叉树Golang
二叉树 前言 完全二叉树 最底层节点按顺序从左到右排列。 满二叉树 一颗二叉树只有0度和2度的节点。 二叉搜索树 左子树上的所有节点的值均小于根节点的值。右子树上的所有节点的值均大于根节点的值。 平衡二叉搜索树 左右两个子树的高度差的绝对值不超过1 。 二叉树的存储…...
通过css的哪些方式可以实现隐藏页面上的元素?
1:opacity:0 通过将元素的透明度设置为o,实现隐藏效果,但是依然会占用空间并可以进行交互。 2:visibility:hidden 与透明度度为0的方案类似,会占据空间,但不可以进行交互。 3:Overflow:hi…...
微信小程序 === 使用腾讯地图选点
目录 插件介绍 接入指引 相关参数说明 插件错误处理 效果图 permission 插件的作用 添加插件 引入插件代码包 使用插件 页面 js 接口 插件介绍 腾讯位置服务地图选点插件 可以让用户快速、准确地选择并确认自己的当前位置,并将相关位置信息回传给开发者。…...
Redis高可用-Cluster(集群)
Redis cluster cluster 为无中心,分布式 sharding,高可用技术架构。 在哨兵 sentinel 机制中,可以解决 redis 高可用的问题,即当 master 故障后可以自动将 slave 提升为 master 从而可以保证 redis 服务的正常使用。 但是无法解…...
Spring Boot编程训练系统:数据管理与存储
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了编程训练系统的开发全过程。通过分析编程训练系统管理的不足,创建了一个计算机管理编程训练系统的方案。文章介绍了编程训练系统的系统分析部分&…...
报告解读 | 创意经济2024:如何在变革中抢占先机?
在科技飞速发展的今天,创意行业正面临前所未有的变化。《Skillshare Trendshare 2024》报告揭示了多项趋势,为创意人士提供了深刻的洞察和实用的建议。本文将为您详细解读这些趋势,助您在创意领域脱颖而出。 1. 人工智能(AI&…...
Flume1.9.0自定义Sink组件将数据发送至Mysql
需求 1、将Flume采集到的日志数据也同步保存到MySQL中一份,但是Flume目前不支持直接向MySQL中写数据,所以需要用到自定义Sink,自定义一个MysqlSink。 2、日志数据默认在Linux本地的/data/log/user.log日志文件中,使用Flume采集到…...
如何在 Ubuntu 24.04 上安装和配置 Fail2ban ?
确保你的 Ubuntu 24.04 服务器的安全是至关重要的,特别是如果它暴露在互联网上。一个常见的威胁是未经授权的访问尝试,特别是通过 SSH。Fail2ban 是一个强大的工具,可以通过自动阻止可疑活动来帮助保护您的服务器。 在本指南中,我…...
uniapp如何i18n国际化
1、正常情况下项目在代码生成的时候就已经有i18n的相关依赖,如果没有可以自行使用如下命令下载: npm install vue-i18n --save 2、创建相关文件 en文件下: zh文件下: index文件下: 3、在main.js中注册:…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
