• mysql包select结果无法同步的问题


            在node项目中使用mysql包时,我遇到一个select出来的结果无法同步到主线程的问题。具体来说是这样的,我把sql相关的操作封装在几个js文件中,比如说与tag相关的crud操作,就放在TagHelper.js中,然后在router.js中,配置路由时根据具体的业务去调用helpers。在TagHelper.js中,我封装的select方法无法返回正确的结果集,之前的方法代码如下

    1. function getAll() {
    2. let res = [];
    3. const sqlStr = "select id,name from tag";
    4. db.query(sqlStr,(err,results)=>{
    5. if (err) {
    6. console.log(err.message);
    7. return;
    8. }
    9. //拷贝一个results给res
    10. res = results.concat();
    11. })
    12. return res;
    13. }

    db是通过mysql.createPool方法创建的。其query方法第二个参数是结果返回的回调函数,这意味着这个回调是一个异步回调,它会等待mysql查询完毕返回结果后再执行,所以node在执行query时就做了两件事:传入了sql字符串和指定了回调,然后就返回空数组res了。那么我们该怎么让query方法等待结果集返回呢?

    这里需要用到async/await的知识,详情可以看我写的这篇文章

    大致理解了async/await后,你就大概知道怎么做了

    1. async function getAll() {
    2. let res = [];
    3. const sqlStr = "select id,name from tag";
    4. let select = function (err, result) {
    5. if (err) {
    6. console.log(err.message);
    7. return;
    8. }
    9. res = result.concat();
    10. // console.log('已赋值');
    11. };
    12. //await会等待promise改变状态
    13. await new Promise((resolve)=>{
    14. db.query(sqlStr, select)
    15. //end的回调应该是在select回调之后执行的,所以这里resolve可以理解
    16. .on('end', function() {
    17. resolve()
    18. });
    19. })
    20. return res;
    21. }

    在router.js中,需要将router的路由方法回调前面加上async修饰,并且里面相关的select方法需要加上await修饰,如:

    1. router.get("/alltags", async function (req, res, next) {
    2. try {
    3. const allTags = await tagHelper.getAll();
    4. const allTagList = allTags.map((val) => {
    5. return val["name"];
    6. });
    7. // console.log(allTagList);
    8. res.status(200).json(allTagList);
    9. } catch (err) {
    10. res.statusCode = 500;
    11. res.statusMessage = "server internal error";
    12. res.send("error");
    13. }
    14. });

            事实上,在没有理解js的async和await之前,我有一些C#的async/await经验,所以尝试着解决了下,但无法很好地去解释它,所以通过我学习promise并对promise做一些笔记,那么我相信这些笔记可以帮助你更好地去理解以及去阐述其中的“为什么”了。

  • 相关阅读:
    云IDE产品的使用教程(java)
    Leetcode113.路径总和II Path Sum II - Python 递归法
    MySQL命令行中文乱码问题
    GDPU 数据结构 天码行空2
    coreldraw是什么软件?最新中文2024版本cdr有哪些功能
    智慧公厕建设的好处
    full mesh
    Java编程基础
    矩阵求导中的分子布局和分母布局
    智慧社区解决方案
  • 原文地址:https://blog.csdn.net/hlz_12345/article/details/126139715