部署后Node.js版Azure Function无法写入MySQL数据库问题排查
问题分析与解决方案
核心问题:await未正确等待数据库查询完成
你当前代码里用了await connection.query(...),但原生mysql库的query方法是回调式API,并不返回Promise,所以await完全不起作用。函数会直接跳过查询逻辑,执行connection.end(),导致数据库查询还没完成就被强制断开连接,自然不会有数据插入。
修复方案
方案1:用Promise包装查询逻辑
把connection.query及相关操作包装成Promise,让await能正确等待执行结果:
const mysql = require('mysql'); module.exports = async function (context, req) { const connection = mysql.createConnection({ host: '*****************', user: '*************', password: '*************', database: '***************' }); // 包装connect为Promise await new Promise((resolve, reject) => { connection.connect(err => { if (err) reject(err); else resolve(); }); }); const insertQuery = `INSERT into emails (email_address, first_name, last_name, preferred_game, date_joined) VALUES ('bob@example.com', 'Bob', 'Jones', 'both', NOW());`; // 包装query为Promise await new Promise((resolve, reject) => { connection.query(insertQuery, (error, results, fields) => { if (error) reject(error); else resolve(results); }); }); // 包装end为Promise,确保连接正常关闭 await new Promise((resolve, reject) => { connection.end(err => { if (err) reject(err); else resolve(); }); }); context.res = { body: '200' }; }
方案2:改用支持Promise的MySQL库(推荐)
直接使用mysql2库的Promise版本,代码更简洁易维护:
const mysql = require('mysql2/promise'); module.exports = async function (context, req) { // 直接创建Promise连接 const connection = await mysql.createConnection({ host: '*****************', user: '*************', password: '*************', database: '***************' }); const insertQuery = `INSERT into emails (email_address, first_name, last_name, preferred_game, date_joined) VALUES ('bob@example.com', 'Bob', 'Jones', 'both', NOW());`; await connection.execute(insertQuery); await connection.end(); context.res = { body: '200' }; }
额外排查点
- 完整添加Azure Function出站IP:Azure Function有多个出站IP地址,仅添加虚拟IP可能不够。在Azure Portal的Function App → 网络 → 出站IP地址,把所有列出的IP都添加到HostGator的MySQL白名单中。
- 完善错误日志:在代码中添加错误捕获,确保能在Azure日志中定位问题:
try { // 数据库操作逻辑 } catch (err) { context.log.error('数据库操作失败:', err); context.res = { status: 500, body: '操作失败' }; } - 检查HostGator MySQL限制:共享服务器可能有连接数、查询频率限制,或者要求使用特定端口(默认3306,部分服务商可能有变更),可联系HostGator客服确认。
内容的提问来源于stack exchange,提问作者John Seed
相关产品推荐
相关产品推荐

