当前位置:网站首页>mysql包select结果无法同步的问题
mysql包select结果无法同步的问题
2022-08-10 16:31:00 【hlz2516】
在node项目中使用mysql包时,我遇到一个select出来的结果无法同步到主线程的问题。具体来说是这样的,我把sql相关的操作封装在几个js文件中,比如说与tag相关的crud操作,就放在TagHelper.js中,然后在router.js中,配置路由时根据具体的业务去调用helpers。在TagHelper.js中,我封装的select方法无法返回正确的结果集,之前的方法代码如下
function getAll() {
let res = [];
const sqlStr = "select id,name from tag";
db.query(sqlStr,(err,results)=>{
if (err) {
console.log(err.message);
return;
}
//拷贝一个results给res
res = results.concat();
})
return res;
}
db是通过mysql.createPool方法创建的。其query方法第二个参数是结果返回的回调函数,这意味着这个回调是一个异步回调,它会等待mysql查询完毕返回结果后再执行,所以node在执行query时就做了两件事:传入了sql字符串和指定了回调,然后就返回空数组res了。那么我们该怎么让query方法等待结果集返回呢?
这里需要用到async/await的知识,详情可以看我写的这篇文章
大致理解了async/await后,你就大概知道怎么做了
async function getAll() {
let res = [];
const sqlStr = "select id,name from tag";
let select = function (err, result) {
if (err) {
console.log(err.message);
return;
}
res = result.concat();
// console.log('已赋值');
};
//await会等待promise改变状态
await new Promise((resolve)=>{
db.query(sqlStr, select)
//end的回调应该是在select回调之后执行的,所以这里resolve可以理解
.on('end', function() {
resolve()
});
})
return res;
}
在router.js中,需要将router的路由方法回调前面加上async修饰,并且里面相关的select方法需要加上await修饰,如:
router.get("/alltags", async function (req, res, next) {
try {
const allTags = await tagHelper.getAll();
const allTagList = allTags.map((val) => {
return val["name"];
});
// console.log(allTagList);
res.status(200).json(allTagList);
} catch (err) {
res.statusCode = 500;
res.statusMessage = "server internal error";
res.send("error");
}
});
事实上,在没有理解js的async和await之前,我有一些C#的async/await经验,所以尝试着解决了下,但无法很好地去解释它,所以通过我学习promise并对promise做一些笔记,那么我相信这些笔记可以帮助你更好地去理解以及去阐述其中的“为什么”了。
边栏推荐
猜你喜欢
电力系统潮流计算与PowerWorld仿真(牛顿拉夫逊法和高斯赛德尔法)(Matlab实现)
WIZnet 物联网设计大赛 - WizFi360大赛延迟通知
【Windows】将排除项添加到安全中心以避免exe被系统自动删除
数据治理项目成功的要点,企业培养数据要把握好关键环节
LabView---双通道示波器(内含信号发生器)
String compression (3) short string compression
v-model指令:获取和设置表单元素的值
生成树协议(STP---Spanning Tree Protocol)
C专家编程 第10章 再论指针 10.3 在锯齿状数组上使用指针
视频转成gif动图怎么操作?仅需三步在线完成视频转gif
随机推荐
C专家编程 第10章 再论指针 10.6 使用指针从函数返回一个数组
JWT 实现登录认证 + Token 自动续期方案
PC软件问题二[Win10系统将UltraEdit添加到右键菜单的方法]
C language symbols on how to use
64位 RT-Thread 移植到 Cortex-A53 系统 bug 修复笔记
Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。
C专家编程 第10章 再论指针 10.5 使用指针向函数传递一个多维数组
【Windows】将排除项添加到安全中心以避免exe被系统自动删除
Annual salary of 600,000+?This 100,000-word interview assault book covers all technology stacks from Ali P5 engineers to P7
软件配置 | pip下载第三方库文件及配置pip源的不完全总结
年薪60万+?这份10万字的面试突击宝典涵盖阿里 P5 工程师~P7 所有技术栈
解决mpi4py导入报错ImportError: libmpi.so.40: cannot open shared object file: No such file or directory
mysql按月查询统计(统计近12个月的项目个数)
家电巨头,不碰儿童生意
一张图快速了解 Istio 的 EnvoyFilter
铜锁密码库
面了个腾讯25k+出来的,他让我见识到什么基础的天花板
如何将jpg图片变成gif?教你一分钟图片合成gif的方法
雷达存在感应器技术,实时感知控制应用,雷达人体探测方案
LabView---双通道示波器(内含信号发生器)