当前位置:网站首页>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做一些笔记,那么我相信这些笔记可以帮助你更好地去理解以及去阐述其中的“为什么”了。
边栏推荐
- cube-studio配置镜像仓库并允许
- 华为-求int型正整数在内存中存储时1的个数
- Basic knowledge of software engineering--requirements analysis
- String compression (3) short string compression
- Embedded Development: Embedded Basics - Mapping Peripherals Using Arrays of Pointers
- C专家编程 第10章 再论指针 10.7 使用指针创建和使用动态数组
- 让页面滚动到指定位置
- 不同主机收不到组播消息原因分析
- v-on补充:自定义参数传递和事件修饰符
- LeetCode-101. Symmetric Tree
猜你喜欢
随机推荐
C语言各种符号如何使用
x86 与 x64 架构下函数参数传递的区别【汇编语言】
mysql按月查询统计(统计近12个月的项目个数)
v-show指令:切换元素的显示与隐藏
Shanxi: 1 death occurred in a coal mine safety accidents was ordered to halt production
Yi Gene|In-depth review: epigenetic regulation of m6A RNA methylation in brain development and disease
一文带你彻底拿下a,b两点间等效电阻
PNG如何变gif?教你一招png秒变gif动图的方法
【Windows】将排除项添加到安全中心以避免exe被系统自动删除
LeetCode-101. Symmetric Tree
Kubernetes kube-proxy工作原理
C专家编程 第10章 再论指针 10.3 在锯齿状数组上使用指针
什么是开源中的 “胖虎效应”
【随笔】自己看的... 保存
李斌带不动的长安新能源高端梦,华为和“宁王”能救吗?
cmake 小技巧 记录
LeetCode-692. Top K Frequent Words
v-model指令:获取和设置表单元素的值
LeetCode-876. Middle of the Linked List
从抖音到火山引擎——看流媒体技术演进和机会









