You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:40:23