Node.js+Express+MySQL项目报错:ReferenceError: require未定义
ReferenceError: Can't find variable: require错误 这个错误本质上是你的代码在不支持CommonJS模块系统的环境中运行导致的——要么是跨文件的模块导入导出逻辑没做好,要么是项目环境切换为ES模块(ESM),甚至可能是误把后端代码放到浏览器环境里执行了。结合你提到的「安装Express后出现问题、SQL类和main函数分属不同文件」这两个关键点,给你几个针对性的解决方案:
1. 修复跨文件的模块导出与导入逻辑
Node.js中不同文件的代码无法直接共享,必须通过模块系统完成导出/导入。你的SQL类在server.js,main.js要使用它,必须先导出再导入:
修改server.js(导出SQL类)
// server.js // 建议把require移到文件顶部,符合CommonJS规范 const mysql = require('mysql'); class SQL { constructor() { this.connection = mysql.createConnection({ host: 'localhost', user: 'root', password: '', database: 'newDB' }); } connect() { this.connection.connect(function(err) { if (err) { console.error('error connecting: ' + err.stack); return; } console.log('Connected'); }); } disconnect() { this.connection.end(function(err) { if (err) { console.error('error ending connection: ' + err.stack); return; } console.log('Connection ended'); }); } } // 导出SQL类,让其他文件可以导入 module.exports = SQL;
修改main.js(导入SQL类)
// main.js // 导入server.js中的SQL类,注意路径要正确 const SQL = require('./server.js'); function main() { const database = new SQL(); database.connect(); // 别忘了调用连接方法,否则不会建立数据库连接 } main();
2. 检查项目是否启用了ES模块(ESM)
如果你的项目根目录的package.json里有"type": "module"配置,Node.js会默认使用ESM规范,这时require就会失效,需要换成import/export语法:
调整server.js为ESM格式
// server.js // 注意:mysql包对ESM支持有限,推荐改用mysql2 import mysql from 'mysql2'; class SQL { constructor() { this.connection = mysql.createConnection({ host: 'localhost', user: 'root', password: '', database: 'newDB' }); } // 其他方法不变... } export default SQL;
调整main.js为ESM格式
// main.js import SQL from './server.js'; function main() { const database = new SQL(); database.connect(); } main();
提示:如果坚持用mysql包,可能需要添加--experimental-specifier-resolution=node参数启动Node.js,比如node --experimental-specifier-resolution=node main.js,但更稳妥的是直接安装mysql2:npm install mysql2
3. 确保代码在Node.js环境运行,而非浏览器
安装Express后,很多人会不小心把后端代码(比如main.js)通过<script>标签引入到前端HTML中——浏览器是不认识require的!你必须通过Node.js命令来执行后端代码:
node main.js
如果是Express服务器,应该启动你的Express入口文件(比如app.js),让它来调用数据库逻辑,而不是直接在浏览器里加载后端脚本。
4. 梳理Express项目结构
如果你的项目是Express + 前端静态资源的混合结构,建议把后端代码(server.js、main.js)放在单独的目录(比如backend/),前端静态资源放在public/目录。启动Express时,通过后端入口文件(比如app.js)来引入数据库逻辑,避免前后端代码混淆导致环境错误。
内容的提问来源于stack exchange,提问作者Oscar Ordoñez

