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
相关产品推荐
相关产品推荐

