外部函数获取内部函数的值,获取不到

先贴代码

const {
    log
} = require('console')
const express = require('express')
const route = express.Router()
const parseUrl = require('url')
const querystring = require('querystring')
const mysql = require('mysql') //mysql
const pool = require('../config/configdb.js')
const mongoose = require('mongoose')
const {
    send
} = require('express/lib/response')

//sql查询封装
function sqlQuery(sql, callback) {
    pool.getConnection((err, conn, next) => {
        if (err) {
            throw (err)
            console.log(err)
        } else {
            conn.query(sql, function(err, data) {
                if (err) throw err //如果有错误信息,抛出错误
                callback(data)
            })
            conn.release(() => {
                log('数据库连接关闭')
            }) //查询完毕,关闭链接
        }
    })
}
route.post('/API/getinform', (req, res) => {
    var pageNum = req.body.page; //当前页
        var total = 0  //总数
    var start, end; //起始、结束条
    if (pageNum == undefined) { //收不到传值时
        pageNum = 1;
        start = 0;
        end = 10;
    } else { //收到数据时
        start = (pageNum - 1) * 13; //当前页-1*13为展示的起始条
        end = pageNum * 13; //结束条
    }

    sqlQuery('select * from gonggao', (data) => {  
            log(data.length)    //此处输出16,获取到了
                total = data.length    //将长度给total
    })
        log(total)    //此处应该为16   但是是0   为什么?
        
    pool.getConnection((err, conn, next) => {
        if (err) {
            throw (err)
            console.log(err)
        } else {
            let sql = 'select *,(select Count(*) from gonggao) as Count from gonggao limit ?,?';
            conn.query(sql, [start, end], (err, data) => {
                if (err) {
                    throw err
                    console.log(err)
                } else {
                    res.send({
                        data,
                        pageNum,
                        //total
                    });
                    conn.release();
                }
            })
        }
    })
})

问题在接口里面

sqlQuery('select * from gonggao', (data) => {  
            log(data.length)    //此处输出16,获取到了
                total = data.length    //将长度给total
    })
        log(total)    //此处应该为16   但是是0   为什么?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7495790
  • 你也可以参考下这篇文章:湖仓一体电商项目(十三):数据发布接口和可视化
  • 除此之外, 这篇博客: 面试官:工作中遇到过主从延迟么?如何解决的?中的 解决 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    1.强制读主库
    好处:保证一定能读到数据且读到的数据是最新的。
    坏处:只适应于并发量不大的场景,否则就失去了读写分离意义。
    实现:查询开事物,自动读主库。
    2.读数据时先sleep一下
    好处:逻辑简单,易操作。
    坏处:降低系统吞吐量。
    3.发生主从延迟时自旋(推荐)
    好处:针对偶现的主从延迟情况做处理。
    实现:当从数据库读到数据为空时,for循环3次,每次等待0.5S,如果还没查出来则报警。
    4.检查代码问题
    如果是Kafka消费的场景可以考虑延时消费。
    写入数据再读出来,这个过程不能放同一个事务里,否则永远读不到。
    避免写入立即查询。写完库后把当前实体的数据带入后面流程,避免再次查库。
    5.MySQL服务端本身的优化
    MySQL 5.6 版本后,提供了一种并行复制的方式,通过将 SQL 线程转换为多个 work 线程来进行重放,这样就解决了主从延迟的问题
    趁着并行复制机制,如果面试官再深入问你一个问题:
    主库突然宕机,此时恰好数据还没同步到从库,那么有些数据可能在从库上是没有的,导致数据丢失,MYSQL如何处理这种情况?
    答:MySQL有半同步复制机制,就是主库写入 binlog 日志之后,就会将强制此时立即将数据同步到从库,从库将日志写入自己本地的 relay log 之后,接着会返回一个 ack 给主库,主库接收到至少一个从库的 ack 之后才会认为写操作完成了。
    MYSQL本身采用半同步复制来解决主库数据丢失问题;并行复制来解决主从同步延时问题。

  • 您还可以看一下 机工社华章IT老师的安全渗透测试课程中的 探索被动侦察方法:发现主机和端口信息小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    对不起,由于您并未提供实际的接口代码和相关信息,我无法给出具体的解决方案。请提供更详细的信息,谢谢。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

说明sqlQuery方法运行有延迟,与log(total)异步运行了,你等让它们变成同步运行的,等待sqlQuery执行完毕后在执行log(total)