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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 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

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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
SQL DataWorks 关系型数据库
DataWorks产品使用合集之如何跨账号访问同一个MySQL
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
1月前
|
关系型数据库 MySQL Linux
Docker安装Mysql5.7,解决无法访问DockerHub问题
当 Docker Hub 无法访问时,可以通过配置国内镜像加速来解决应用安装失败和镜像拉取超时的问题。本文介绍了如何在 CentOS 上一键配置国内镜像加速,并成功拉取 MySQL 5.7 镜像。
305 2
Docker安装Mysql5.7,解决无法访问DockerHub问题
|
29天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
1月前
|
SQL JavaScript 关系型数据库
Node.js 连接 MySQL
10月更文挑战第9天
20 0
|
2月前
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
43 0
Node服务连接Mysql数据库
|
3月前
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
60 3
|
3月前
|
JavaScript
NodeJs——无法使用内网IP访问
NodeJs——无法使用内网IP访问
42 1
|
3月前
|
JavaScript Linux 容器
【Azure 应用服务】NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问
【Azure 应用服务】NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问
|
3月前
|
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的便捷性及高效性,为初学者提供快速入门指南。
36 0
|
3月前
|
NoSQL 关系型数据库 MySQL
无法访问Docker 里的 mysql, redis
无法访问Docker 里的 mysql, redis
25 0
下一篇
无影云桌面