使用mysql2.ping检测MySQL服务状态时变量赋值不生效如何解决
问题根因
你使用的mysql2回调式API默认不会返回Promise,直接对db.ping()使用await是无效的,代码不会等待回调逻辑执行完成,就会提前执行下方的res.send返回响应,所以拿到的status始终是初始值。
前置修正:database.js语法问题
现有database.js配置中password: 'test'后缺少逗号,会触发语法报错,先修正:
const mysql = require('mysql2'); module.exports = mysql.createConnection({ host: 'localhost', user: 'testdb_user', password: 'test', // 新增逗号 database: 'testdb' });
方案1:手动包装回调为Promise实现外部变量赋值
只需修改health.js,将ping的回调逻辑包装成Promise让await可以等待执行完成:
var express = require('express'); var router = express.Router(); const db = require('../database'); /* GET health check */ router.get('/', async function(req, res, next) { var status = "nothing here yet"; // 包装回调为Promise,await会等待resolve触发后再往下执行 await new Promise((resolve) => { db.ping((err) => { if(err) { status = "Server is down!"; } else { status = "MySQL Server is Active"; } resolve(); // 标记异步操作结束 }) }) res.status(200).send(status); }); module.exports = router;
方案2:使用mysql2自带的Promise版本API(更推荐)
直接用mysql2官方提供的promise适配层,不需要手动处理回调:
- 先修改
database.js引入promise版本:
const mysql = require('mysql2/promise'); module.exports = mysql.createConnection({ host: 'localhost', user: 'testdb_user', password: 'test', database: 'testdb' });
- 修改
health.js直接用await调用ping方法:
var express = require('express'); var router = express.Router(); const db = require('../database'); /* GET health check */ router.get('/', async function(req, res, next) { var status = "nothing here yet"; try { const connection = await db; await connection.ping(); status = "MySQL Server is Active"; } catch (err) { status = "Server is down!"; } res.status(200).send(status); }); module.exports = router;
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

