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

Node.js导入mysql遇require未定义错误,如何兼容ES模块?

解决Node.js中ES模块与CommonJS模块共存的问题

方案1:在ES模块环境中用createRequire兼容CommonJS语法

保留package.json中的"type": "module",修改connect.js代码,借助Node.js内置的createRequire加载mysql包:

// connect.js
import { createRequire } from 'module';
const require = createRequire(import.meta.url);

// 原有mysql连接代码无需修改
const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'your_user',
  password: 'your_password',
  database: 'your_db'
});

connection.connect();
// ...其他连接逻辑

这样connect.js能在ES模块环境正常运行,index.js的Express ES模块语法(比如import express from 'express')也不受影响。

方案2:通过文件名后缀指定单个文件为CommonJS格式

直接把connect.js重命名为connect.cjs,Node.js会自动识别该后缀为CommonJS模块,原有的require代码完全不用改。
如果index.js需要引入这个文件,直接用ES模块的import语法即可:

// index.js
import connection from './connect.cjs';
// ...其他Express业务代码

这种方式无需改动任何代码逻辑,仅靠文件名后缀区分模块类型,适合不想修改代码的场景。

方案3:统一项目为CommonJS模块

如果愿意调整index.js的代码,移除package.json中的"type": "module",把index.js的ES模块语法改成CommonJS:

// index.js
const express = require('express');
const app = express();
// ...其他Express配置代码

// 引入connect.js
const connection = require('./connect.js');

整个项目切换为CommonJS模块系统后,connect.js的原有代码可以直接运行,无需任何修改。

额外提示

  • 卸载requirejs,它是浏览器端的模块加载工具,对Node.js的模块冲突问题毫无帮助,反而会造成混淆。
  • 建议替换mysql包为mysql2,它原生支持ES模块,无需兼容处理,直接用import mysql from 'mysql2'就能完成数据库连接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:15:36