告别回调地狱,在Node里优雅的访问MySQL(四)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Node.js 环境里面访问 MySQL 的默认方式,采用了古老的回调方式,这样很容易产生回调地狱。那么如何避免呢?这里介绍一种基于 Promise 的封装方式,可以避免回调地狱,并且支持事务访问。

分页和查询


分页信息和查询条件

{
"tableName": "node_user",
"idKey": "id",
"cols": {
"id": "",
"name": "",
"age": ""
},
"pager": {
"pagerTotal": 100,
"pagerSize": 2,
"pagerIndex": 1,
"orderBy": { "id": false }
},
"query": {
"name":[401, 402, 403],
"age":[401]
}
}


// meta
const meta = require('../public/model/10050-user-find.json')
const pager = meta.pager
// 查询条件
const query = {
name: [403, 'a']
}
// 获取分页数据
const test_getPager = () => {
console.log('\n---- getPager ----')
returnnewPromise((resolve, reject) => {
getPager(help, meta, query, pager).then((list) => {
// 获取列表
resolve(list)
})
})
}
// 获取总记录数
const test_getCount = () => {
console.log('\n---- getCount ----')
returnnewPromise((resolve, reject) => {
getCount(help, meta, query).then((count) => {
// 获取总记录数
console.log('外部获取总记录数:', count)
resolve(count)
})
})
}
const test = async (canCount) => {
if (canCount) {
pager.pageTotal = await test_getCount()
}
// 开始测试
test_getPager().then((list) => {
// 关闭
help.close()
})
}
test(true)


这里可以灵活的设置查询条件,以及具体的分页方式。还可以根据需求设置是否需要统计总记录数。

运行结果:

39.png

分页结果


事务的用法


简单地说就是开启事务,执行操作,提交事务。也就是在上面那些代码的外面套上事务即可。

// 循环添加
help.begin().then((cn) => {
const arr = []
for (let i=100; i<110;i++) {
arr.push(test_addData(i, cn))
}
Promise.all(arr).then((res) => {
console.log('事务的批量添加:', res)
// 提交事务
help.commit(cn).then(() => {
console.log(' + + + promise 提交事务的回调:')
// 关闭
help.close(cn)
help.closePool()
})
})
})

await模式开启事务

asyncfunction check() {
const cn = await help.begin()
// 添加数据
await test_addData('51', cn)
// 获取记录进行验证
const model1 = await test_getData(cn)
console.log('(await 添加)name :', model1[0].name === '测试基础添加数据-A-11')
console.log('(await 添加)age :', model1[0].age === 51)
// 修改数据
await test_updateData(cn)
// 获取记录进行验证
const model2 = await test_getData(cn)
console.log('(await 修改)name :', model2[0].name === '测试基础添加数据-A-11--修改了')
console.log('(await 修改)age :', model2[0].age === 300)
// 修改数据
await test_deleteData(cn)
// 获取记录进行验证
const model3 = await test_getData(cn)
// 验证数据
console.log('删除!', model3.length === 0)
await help.commit(cn)
help.close(cn)
help.closePool()
}
check()

最后需要注意的是“事务的并发性”。js是单线程的,但是MySQL是多线程的。所以如果同时开启两个事务的话,虽然可以通过两个独立的连接对象加以区分,提交事务的时候不会干扰,但是添加、修改的顺序却无法独立,会出现交叉的情况

源码:


https://gitee.com/naturefw/node-services

https://gitee.com/naturefw/node-services/tree/master/packages

本文作者:自然框架

个人网址:jyk.cnblogs.com

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
关系型数据库 MySQL Linux
Docker安装Mysql5.7,解决无法访问DockerHub问题
当 Docker Hub 无法访问时,可以通过配置国内镜像加速来解决应用安装失败和镜像拉取超时的问题。本文介绍了如何在 CentOS 上一键配置国内镜像加速,并成功拉取 MySQL 5.7 镜像。
691 2
Docker安装Mysql5.7,解决无法访问DockerHub问题
|
3月前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
3月前
|
SQL JavaScript 关系型数据库
Node.js 连接 MySQL
10月更文挑战第9天
39 0
|
4月前
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
52 0
Node服务连接Mysql数据库
|
5月前
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
132 3
|
5月前
|
JavaScript Linux 容器
【Azure 应用服务】NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问
【Azure 应用服务】NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问
|
5月前
|
JavaScript 前端开发 API
揭秘Node.js如何轻松访问API:一个示例足以改变你的开发视角!
【8月更文挑战第21天】在现代Web开发中,API是软件间通信的关键。Node.js以其高效性,在API访问上独具优势。本文通过示例展示如何用Node.js访问API。首先确保已安装Node.js,然后使用npm安装`axios`库。创建`api_example.js`文件,并编写代码以访问JSONPlaceholder API获取数据。成功时,响应数据会输出至控制台;若失败,则打印错误。此示例展示了Node.js结合`axios`访问API的便捷性及高效性,为初学者提供快速入门指南。
48 0
|
11天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
38 3
|
11天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
38 3
|
11天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
52 2