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模块:
- 在
package.json中添加"type": "module" - 将
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
相关产品推荐
相关产品推荐

