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

Node.js中如何用顶层await导出mysql2连接池?

你的代码报错是因为当前文件是CommonJS模块(用require导入),而Node v16中顶级await仅支持ES模块(后缀为.mjs或在package.json里设置"type": "module"),所以不能在CommonJS环境下使用顶级await。

另外你可能误解了mysql2/promise的createPool方法:它是同步创建连接池实例的,返回的不是Promise,根本不需要用await。直接导出池实例,其他模块导入后就能直接调用它的异步方法(比如query)。

最简洁的正确实现(CommonJS)

// db.js
const config = require('./configs/config');
const mysql = require('mysql2/promise');

// createPool同步生成池实例,直接导出
const pool = mysql.createPool({
    host: config.db.host,
    user: config.db.user,
    database: config.db.database,
    password: config.db.password,
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0,
    charset: 'UTF8MB4_GENERAL_CI'
});

module.exports = pool;

使用示例

其他模块导入后,直接在异步函数里调用池的方法即可:

const pool = require('./db.js');

async function getUsers() {
    // query方法返回Promise,用await解析结果
    const [rows] = await pool.query('SELECT * FROM users');
    return rows;
}

如果需要确保连接池可用后再导出

要是你想在导出前验证连接池能正常连接,可以用以下方式:

// db.js
const config = require('./configs/config');
const mysql = require('mysql2/promise');

let poolInstance = null;

// 封装初始化逻辑,保证只执行一次
async function initPool() {
    if (!poolInstance) {
        poolInstance = mysql.createPool({
            host: config.db.host,
            user: config.db.user,
            database: config.db.database,
            password: config.db.password,
            waitForConnections: true,
            connectionLimit: 10,
            queueLimit: 0,
            charset: 'UTF8MB4_GENERAL_CI'
        });
        // 尝试获取一个连接,验证池可用
        const conn = await poolInstance.getConnection();
        conn.release();
    }
    return poolInstance;
}

// 导出一个已完成初始化的Promise
module.exports = initPool();

使用时在异步函数里await这个Promise:

const poolPromise = require('./db.js');

async function main() {
    const pool = await poolPromise;
    const [rows] = await pool.query('SELECT * FROM users');
    console.log(rows);
}

改用ES模块使用顶级await(可选)

如果想用上顶级await,可以把项目转为ES模块:

  1. 在package.json中添加 "type": "module"
  2. 将require替换为import:
// db.js
import config from './configs/config.js';
import mysql from 'mysql2/promise';

const pool = mysql.createPool({
    host: config.db.host,
    user: config.db.user,
    database: config.db.database,
    password: config.db.password,
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0,
    charset: 'UTF8MB4_GENERAL_CI'
});

// 可选:验证连接
const conn = await pool.getConnection();
conn.release();

export default pool;

其他模块直接导入使用:

import pool from './db.js';

async function getUsers() {
    const [rows] = await pool.query('SELECT * FROM users');
    console.log(rows);
}

内容的提问来源于stack exchange,提问作者NicholasJohn16

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:25:18