Rookie Xie 2023-05-09 23:26 采纳率: 33.3%
浏览 16

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

先贴代码

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   为什么?

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-10 08:32
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: 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:

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


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

报告相同问题?

问题事件

  • 创建了问题 5月9日

悬赏问题

  • ¥15 Java与Hbase相关问题
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开
  • ¥15 在centos7安装conda
  • ¥15 c#调用yolo3 dll文件获取的数据对不上
  • ¥20 WPF 如何实现多语言,label 和cs(live Charts)中是否都能翻译
  • ¥15 STM32F103上电短路问题
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框