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"
}

部分测试结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/469996.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB代码】二维平面上的TDOA,使用加权最小二乘法,不限制锚点数量,代码可复制粘贴

本文所述的MATLAB代码实现了一个基于两步加权最小二乘法的二维目标定位算法,利用多个锚点(基站)和时间差到达(TDOA)数据来估计未知目标的位置。 订阅专栏后可以看到完整代码,复制到MATLAB空脚本上面即可直接运行。若需要单独下载,可通过下面的链接:https://download.cs…

python数据写入excel文件

主要思路&#xff1a;数据 转DataFrame后写入excel文件 一、数据格式为字典形式1 k e &#xff0c; v [‘1’, ‘e’, 0.83, 437, 0.6, 0.8, 0.9, ‘好’] 1、这种方法使用了 from_dict 方法&#xff0c;指定了 orient‘index’ 表示使用字典的键作为行索引&#xff0c;然…

【深度学习】LSTM、BiLSTM详解

文章目录 1. LSTM简介&#xff1a;2. LSTM结构图&#xff1a;3. 单层LSTM详解4. 双层LSTM详解5. BiLSTM6. Pytorch实现LSTM示例7. nn.LSTM参数详解 1. LSTM简介&#xff1a; LSTM是一种循环神经网络&#xff0c;它可以处理和预测时间序列中间隔和延迟相对较长的重要事件。LSTM通…

使用ookii-dialogs-wpf在WPF选择文件夹时能输入路径

在进行WPF开发时&#xff0c;System.Windows.Forms.FolderBrowserDialog的选择文件夹功能不支持输入路径&#xff1a; 希望能够获得下图所示的选择文件夹功能&#xff1a; 于是&#xff0c;通过NuGet中安装Ookii.Dialogs.Wpf包&#xff0c;并创建一个简单的工具类&#xff1a; …

【leetcode练习·二叉树】用「分解问题」思维解题 II

本文参考labuladong算法笔记[【强化练习】用「分解问题」思维解题 II | labuladong 的算法笔记] 技巧一 类似于判断镜像二叉树、翻转二叉树的问题&#xff0c;一般也可以用分解问题的思路&#xff0c;无非就是把整棵树的问题&#xff08;原问题&#xff09;分解成子树之间的问…

Qt 编写插件plugin,支持接口定义信号

https://blog.csdn.net/u014213012/article/details/122434193?spm1001.2014.3001.5506 本教程基于该链接的内容进行升级&#xff0c;在编写插件的基础上&#xff0c;支持接口类定义信号。 环境&#xff1a;Qt5.12.12 MSVC2017 一、创建项目 新建一个子项目便于程序管理【…

PaaS云原生:分布式集群中如何构建自动化压测工具

场景 测试环境中&#xff0c;压测常常依赖环境中的各种工具获取基础信息&#xff0c;而这些工具可能集中在某个中控机上&#xff0c;此时想打造的自动化工具的运行模式是&#xff1a; 通过中控机工具获取压测所需的基本信息在中控机部署压测工具&#xff0c;实际压测任务分发…

关于sass在Vue3中编写bem框架报错以及警告问题记录

在编写完bem框架后 在vite.config.ts文件进行预编译处理时&#xff0c;报错的错误 1. 处理方式&#xff1a;使用新版api&#xff0c; 如图&#xff1a; 2. 处理方式&#xff1a;使用 use 替换掉 import&#xff0c; 如图&#xff1a; 3. 处理方式&#xff1a;使用路径别名&am…

内置RTK北斗高精度定位的4G执法记录仪、国网供电服务器记录仪

内置RTK北斗高精度定位的4G执法记录仪、国网供电服务器记录仪BD311R 发布时间: 2024-10-23 11:28:42 一、 产品图片&#xff1a; 二、 产品特性&#xff1a; 4G性能&#xff1a;支持2K超高清图传&#xff0c;数据传输不掉帧&#xff0c;更稳定。 独立北…

【前端】深入浅出的React.js详解

React 是一个用于构建用户界面的 JavaScript 库&#xff0c;由 Facebook 开发并维护。随着 React 的不断演进&#xff0c;官方文档也在不断更新和完善。本文将详细解读最新的 React 官方文档&#xff0c;涵盖核心概念、新特性、最佳实践等内容&#xff0c;帮助开发者更好地理解…

【Elasticsearch入门到落地】1、初识Elasticsearch

一、什么是Elasticsearch Elasticsearch&#xff08;简称ES&#xff09;是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容。它使用Java编写&#xff0c;基于Apache Lucene来构建索引和提供搜索功能&#xff0c;是一个分布式、可扩展、近实…

扫雷游戏代码分享(c基础)

hi , I am 36. 代码来之不易&#x1f44d;&#x1f44d;&#x1f44d; 创建两个.c 一个.h 1&#xff1a;test.c #include"game.h"void game() {//创建数组char mine[ROWS][COLS] { 0 };char show[ROWS][COLS] { 0 };char temp[ROWS][COLS] { 0 };//初始化数…

ORA-01092 ORA-14695 ORA-38301

文章目录 前言一、MAX_STRING_SIZE--12C 新特性扩展数据类型 varchar2(32767)二、恢复操作1.尝试恢复MAX_STRING_SIZE参数为默认值2.在upgrade模式下执行utl32k.sql 前言 今天客户发来一个内部测试库数据库启动截图报错&#xff0c;描述是“上午出现服务卡顿&#xff0c;然后重…

ODOO学习笔记(3):Odoo和Django的区别是什么?

Odoo和Django都是基于Python的开源框架&#xff0c;但它们的设计目标和用途有所不同&#xff1a; 设计目标和用途&#xff1a; Odoo&#xff1a;Odoo是一个企业资源规划&#xff08;ERP&#xff09;系统&#xff0c;它提供了一套完整的商业管理软件&#xff0c;包括会计、库存…

零基础玩转IPC之——海思平台实现P2P远程传输实验(基于TUTK,国科君正全志海思通用)

老规矩&#xff0c;先做实验测试。以本店Hi3516EV200\GK7205开发板为例&#xff0c;其他开发板操作类似。 将源码包p2p-h264.tgz放到虚拟机&#xff0c;解压&#xff0c;编译 tar -jxvf p2p-h264.tgz cd p2p-h264 make clean make 得到可执行文件p2p-h264 启动开发板&…

如何理解DDoS安全防护在企业安全防护中的作用

DDoS安全防护在安全防护中扮演着非常重要的角色。DDoS&#xff08;分布式拒绝服务&#xff09;攻击是一种常见的网络攻击&#xff0c;旨在通过向目标服务器发送大量请求&#xff0c;以消耗服务器资源并使其无法正常运行。理解DDoS安全防护的作用&#xff0c;可以从以下几个方面…

Python如何从HTML提取img标签下的src属性

目录 前提准备步骤1. 解析HTML内容2. 查找所有的img标签3. 提取src属性 完整代码 前提准备 在处理网页数据时&#xff0c;我们经常需要从HTML中提取特定的信息&#xff0c;比如图片的URL。 这通常通过获取img标签的src属性来实现。 在开始之前&#xff0c;你需要确保已经安装…

Redis主从复制(replication)

文章目录 是什么作用使用案例实操主从复制原理和工作流程slave启动&#xff0c;同步初请首次连接&#xff0c;全量复制心跳持续&#xff0c;保持通信进入平稳&#xff0c;增量复制从机下线&#xff0c;重连续传 复制的缺点 是什么 主从复制&#xff0c;master以写为主&#xf…

Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别

目录 一、概念 1、纹理过滤 2、邻近过滤 3、线性过滤 二、邻近过滤和线性过滤的区别 三、源码下载 一、概念 1、纹理过滤 当纹理被应用到三维物体上时&#xff0c;随着物体表面的形状和相机视角的变化&#xff0c;会导致纹理在渲染过程中出现一些问题&#xff0c;如锯齿…

记录日志中logback和log4j2不能共存的问题

本文章记录设置两个日志时候&#xff0c;控制台直接报错 标黄处就是错误原因&#xff1a;1. SLF4J(W)&#xff1a;类路径包含多个SLF4J提供程序。 SLF4J(W)&#xff1a;找到提供程序[org.apache.logging.slf4j. net]。 SLF4J(W)&#xff1a;找到提供程序[ch.qos.log .classi…