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进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
